2015-11-14 2 views
1

У меня есть метод в C#, который получает файлы в каталоге так:FileInfo удалить файл из списка

FileInfo[] fileInfo = new DirectoryInfo(mypath).GetFiles(); 

Некоторые из файлов в каталоге не являются те, которые мы должны обработать (единственный путь к знать по его содержанию, а не по расширению файла), поэтому мы хотели бы удалить их из списка FileInfo (а не с диска).

Я искал простой способ исключить файл в массиве FileInfo, но, похоже, это не так.

Вот весь код, который проверяет файлы нам нужны только в каталоге пользователь выбирает:

int number_of_files = fileInfo.Length; 
for (int i = 0; i < number_of_files ; ++i) 
{ 
    string file= fileInfo[i].FullName; 
    BinaryReader br = new BinaryReader(new FileStream(file, FileMode.Open, FileAccess.Read), Encoding.ASCII); 
    byte[] preamble = new byte[132]; 
    br.Read(preamble, 0, 132); 
    if (preamble[128] != 'D' || preamble[129] != 'I' || preamble[130] != 'C' || preamble[131] != 'M') 
    { 
     if (preamble[0] + preamble[1] != 0008) 
     { 
      return; //Rather than return, remove the file in question from the list.... 
     } 
    } 
    br.Dispose(); 
} 

Любые идеи, как я могу это сделать?

+1

Хорошо, как вы можете выразить те из них, которые вам не нужны? –

+0

Я добавил дополнительную информацию, не до расширения файлов, это содержание файла, что важно – Matias

ответ

3

Вместо удаления файла из FileInfo[] массива, рассмотрим только создание отдельного списка, который собирает все файлы, которые вы хотите сохранить:

FileInfo[] files = new DirectoryInfo(mypath).GetFiles(); 
List<FileInfo> filteredFiles = new List<FileInfo>(); 
foreach (FileInfo file in fileInfos) 
{ 
    string file= fileInfo[i].FullName; 
    using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read)) 
    using (var br = new BinaryReader(stream, Encoding.ASCII)) 
    { 
     byte[] preamble = new byte[132]; 
     br.Read(preamble, 0, 132); 
     if (preamble[128] != 'D' || preamble[129] != 'I' || preamble[130] != 'C' || preamble[131] != 'M') 
     { 
      if (preamble[0] + preamble[1] != 0008) 
      { 
       // skip this file 
       continue; 
      } 

      // keep the file 
      filteredFiles.Add(file); 

      // do something else with the file 
     } 
    } 
} 

Вы должны думать о том, читает файлы только для фильтрации их действительно стоит того, чтобы избавиться. Если вы позже закончите обработку фильтрованных файлов, вам следует подумать об этом в одно и то же время, поэтому вам не нужно дважды открывать файл (один раз, чтобы понять, что вы хотите его сохранить, и один раз, чтобы фактически обработать Это). Таким образом, вы также можете избавиться от списка filteredFiles, так как вы можете просто пропустить файлы, которые вам не интересны и обрабатывать другие.

+0

Спасибо, Poke, это сработало! очень признателен. – Matias

Смежные вопросы