2009-08-03 6 views
2

Je suis en train de charger un fichier que je sais qu'une partie du nom (et de savoir qu'il sera identifié de manière unique par la partie que je sais.)Charger un System.IO.FileStream en utilisant un WildCard

Voici le brin de celui-ci:

string fileName = ID + " - " + Env + " - "; 
byte[] buffer; 
using (FileStream fileStream = new FileStream(Server.MapPath("~") + 
    fileName + "*", FileMode.Open)) 
{ 
    using (BinaryReader reader = new BinaryReader(fileStream)) 
    { 
     buffer = reader.ReadBytes((int)reader.BaseStream.Length); 
    } 
} 

Ligne 4 est où j'ai besoin d'aide. Si je dis fileName + "*" alors j'obtiendra "ID - Env - *" au lieu d 'un caractère générique correspondant à n'importe quel fichier après "ID - Env -" (J'ai de vraies variables pour ID et Env, elles ne sont pas montrées ici.

Y a-t-il un moyen de dire "correspondre à n'importe quel fichier qui correspond au début"?

(J'utilise VS 2008 SP1 et .NET 3.5 SP1)

Merci pour toute aide.

Répondre

4

Vous devez localiser le fichier que vous voulez avant d'ouvrir un FileStream.

string[] files = System.IO.Directory.GetFiles(Server.MapPath("~"), fileName + "*"); 

if(files.Length == 1) // We got one and only one file 
{ 
    using(BinaryReader reader = new BinaryReader(new FileStream(files[0]))) 
    { 
     // use the stream 
    } 
} 
else // 0 or +1 files 
{ 
//... 
} 
+0

J'ai préféré votre exemple, mais System.IO.Directory.GetFiles ne renvoie pas le type FileInfo []. Il renvoie une liste de chaînes. – Vaccano

+0

Je l'ai couru avec String [] comme résultat et j'ai reçu une ArgumentException sur System.IO.Directory.GetFiles. (Caractères illégaux dans le chemin). – Vaccano

+0

Seule la version à 2 arguments accepte les caractères génériques. –

1

Vous pouvez utiliser la méthode Directory.GetFiles() pour obtenir une collection de fichiers correspondant d'abord au modèle, puis travailler avec le flux en fonction du résultat.

+0

Qui voter cette baisse? –

1

Utilisez le nom du premier résultat de System.IO.Directory.GetFiles()

1

Non, mais c'est trivial à faire soi-même.

private string ResolveWildcardToFirstMatch(string path) 
{ 
    return Directory.GetFiles(Path.GetDirectoryName(path), 
           Path.GetFileName(path) + "*")[0]; 
} 
+0

Cela a le potentiel de sauter assez facilement ... –

+0

Oui, c'est le cas. J'espère que personne ne copie/colle des échantillons d'API de 5 secondes dans le code de production! –

1

Exemple d'utilisation des cartes sauvages:

string[] fileNames = System.IO.Directory.GetFiles(@"c:\myfolder", "file*"); 
    if (fileNames.Length > 0) 
    { 
    // Read first file in array: fileNames[0] 
    } 
Questions connexes