2009-08-03 5 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); 
    } 
} 

Строка 4, где мне нужна помощь. Если я скажу fileName + «*», тогда вместо «подписи» - «Env» («Идентификатор - Env») я получу «ID - Env - *» вместо подстановочного знака, который соответствует реальным vars для ID и Env, они просто не показаны здесь.)

Есть ли способ сказать «соответствие любому файлу, который соответствует началу»?

(я использую VS 2008 SP1 и .NET 3.5 SP1)

Спасибо за любую помощь.

ответ

4

Вам нужно найти файл, который вы хотите, прежде чем открыть 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

Мне понравился ваш пример лучше всего, но System.IO.Directory.GetFiles не возвращает тип FileInfo []. Он возвращает список строк. – Vaccano

+0

Я запустил его с помощью String [], и я получил ArgumentException в System.IO.Directory.GetFiles. (Незаконные символы в пути). – Vaccano

+0

Только версия с двумя аргументами принимает подстановочные знаки. –

1

Вы можете использовать метод Directory.GetFiles(), чтобы сначала получить коллекцию файлов, которые соответствуют шаблону, а затем работают с потоком на основе результата.

+0

Кто будет голосовать это вниз? –

1

Используйте имя от первого результата 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] 
    } 
Смежные вопросы