2009-08-03 7 views
2

を使用してSystem.IO.FileStreamロード(と、それは一意に私が知っている部分で識別されることを知っているが。)私は名前の一部を知っているファイルをロードしようとしていますワイルドカード

されますそれのジスト:

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); 
    } 
} 

私は助けが必要です。私がfileName + "*"と言うと、 "ID - Env - "の後のファイルにマッチするワイルドカードの代わりに "ID - Env - *"を取得します(IDとEnvの実際のvarsを持っています。

"最初に合ったファイルに一致する"という言い方はありますか?

任意の助け

おかげで(私はVS 2008 SP1および.NET 3.5 SP1を使用しています)。

答えて

4

の最初の結果から名前を使用してください。

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

私はあなたのベストを好きでしたが、System.IO.Directory.GetFilesはFileInfo []型を返しません。文字列リストを返します。 – Vaccano

+0

結果をString []で実行し、System.IO.Directory.GetFilesでArgumentExceptionを取得しました。 (パスの不正な文字)。 – Vaccano

+0

2引数バージョンのみがワイルドカードを受け入れます。 –

1

Directory.GetFiles()メソッドを使用して、パターンに最初に一致するファイルのコレクションを取得し、その結果に基づいてストリームを処理できます。

+0

これを否決でしょうか? –

1

はあなたがFileStreamを開く前に、必要なファイルを検索する必要がありますSystem.IO.Directory.GetFiles()

1

いいえ、それは自明です。

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

これは非常に簡単に爆破する可能性がある... –

+0

はい、そうです。 5秒のAPIサンプルをプロダクションコードにコピー&ペーストすることは誰も望ましくないことでしょう。 –

1

例使用したワイルドカード:

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