2015-07-24 4 views
-1

В настоящее время я использую следующий фрагмент, чтобы просмотреть миллионы файлов в очень большом каталоге, а затем скопировать те, которые мне нужны, в другой рабочий каталог. sNos - int[], который содержит целые числа. Я проверяю, содержит ли имя файла одно из этих целых чисел, если «Да», оно скопировано в мой локальный каталог.Как сравнить файлы при копировании их в другой каталог?

string[] allFiles = System.IO.Directory.GetFiles(@"C:\ExampleFolder"); 
      foreach (string file in allFiles) 
      { 
       for (int i = 0; i < sNos.Count(); i++) 
       { 
        if (file.Contains(sNos[i].ToString())) 
        { 
         File.Copy(file, "C:\\newFolder\\" + file.Substring(file.Length - 25), true); 
        } 
       } 
      } 

Теперь, чтобы быть конкретным .. имена файлов в формате XXXXXX_XX_XX_XX_XXX_XX. X обозначает целое число. Первые 6 чисел в имени файла - это то, что я пытаюсь сопоставить со значениями в моем массиве int. Проблема заключается в следующем, может быть файлы с такими именами, как:

123456_33_42_56_234_44 (Size: 1 MB) 
123456_33_46_34_992_23 (Size: 2 MB) 

Теперь, так как файлы будут соответствовать «123456» в моем целочисленный массив, как будут скопированы. Тем не менее, я хочу, чтобы файл большего размера копировался каждый раз, когда есть совпадение с несколькими файлами. Может быть совпадение с 2 файлами, может быть, 3 или даже больше. Как я могу это сделать? Любая помощь будет оценена!

+0

Создайте словарь с int как ваши ключи и укажите фактический файл имени. Поэтому, если вы найдете совпадение, вы сравниваете размер файла и соответствующим образом заменяете. Затем вы переходите через словарь и скопируете файлы. –

+0

Являются ли sNos всегда шестью цифрами? Или может быть более короткий ints там, которые ноль-padded в именах файлов? –

+0

@JerryFederspiel Они всегда 6 цифр и не имеют нулевой пробел – sparta93

ответ

0
var stringIds = sNos.Select(id=>id.ToString()).ToList(); 

// get the matching files and group them by id 
var filesById = (from file in allFiles 
       let id = stringIds.FirstOrDefault(n => file.StartsWith(n)) 
       where id != null 
       select new {file, id}).ToLookup(anon=>anon.id, anon.file); 

// within each group, get the biggest file 
var onlyBiggestById = filesById.ToDictionary(
          fileGroup => fileGroup.key, 
          fileGroup => fileGroup.Select(file => new {file, length = new System.IO.FileInfo(file).Length}) 
               .OrderByDescending(anon=>anon.Length) 
               .Select(anon=>anon.file) 
               .First()) 

// Actually copy the files 
onlyBiggestById.Values.ToList() 
    .ForEach(file => File.Copy(file, "C:\\newFolder\\" + file.Substring(file.Length - 25), true)); 
0

взять помощь FileInfo, чтобы получить размер файла и condtions согласно вашему требованию.

// Create new FileInfo object and get the Length. 
    FileInfo f = new FileInfo(file); 
    long s1 = f.Length; 
Смежные вопросы