2013-03-07 6 views
0

У меня есть проект, который преобразует файлы PDF в файлы tif. И исходные файлы нумеруются в форме. файл1, файл2, файл3 ....... файл20. Когда я делаю код ниже, чтобы получить файлы, они расположены в списке, как показано ниже, что неверно. Любые идеи, как обойти это?Сортировка файлов в порядке возрастания

FileInfo[] finfos = di.GetFiles("*.*"); 

finfos[0]=file1 

finfos[1]=file10 

finfos[2]=file11 

finfos[3]=file12 

.... 
................... 

finfos[4]=file19 

finfos[5]=file2 

finfos[6]=file20 

finfos[7]=file3 

finfos[7]=file4 
+1

Будут ли они всегда называться 'file {number}'? или это просто пример, и на самом деле они могут быть «моими цифрами» или «днем рождения» - Джим? –

+1

Поиск - есть несколько похожих вопросов о том, как сделать компаратор для такого рода. Также, если вы просто назовете их «file0001», это будет намного проще. –

+0

Этот http://stackoverflow.com/questions/12373041/sorting-an-array-of-files-for-rename очень близок к тому, что вы хотите. –

ответ

0

если они созданы для того, чтобы отсортировать по дате создания.

здесь является решение вашей проблемы с помощью списка

class Program 
{ 
    private static int CompareWithNumbers(FileInfo x, FileInfo y) 
    { 
     if (x == null) 
     { 
      if (y == null) 
      { 
       // If x is null and y is null, they're 
       // equal. 
       return 0; 
      } 
      else 
      { 
       // If x is null and y is not null, y 
       // is greater. 
       return -1; 
      } 
     } 
     else 
     { 
      // If x is not null... 
      // 
      if (y == null) 
      // ...and y is null, x is greater. 
      { 
       return 1; 
      } 
      else 
      { 

       int retval = x.CreationTime<y.CreationTime?-1:1; 
       return retval;   

      } 
     } 
    } 
    static void Main(string[] args) 
    { 
     DirectoryInfo di = new DirectoryInfo("d:\\temp"); 
     List<FileInfo> finfos = new List<FileInfo>(); 
     finfos.AddRange(di.GetFiles("*")); 
     finfos.Sort(CompareWithNumbers); 

     //you can do what ever you want 
    } 
} 
+0

Просьба указать ссылку, подтверждающую эту инструкцию. (Очевидно, что не [Directory.GetFiles] (http://msdn.microsoft.com/en-us/library/07wt70x2.aspx) - «Порядок имен возвращаемых файлов не гарантируется») –

+0

@AlexeiLevenkov Не могли бы вы переименовать некоторые файлы из 1, чтобы сказать 12? После того, как файл1 извлечен, файл10 будет следующим вместо файла2 – electricalbah

+0

. Я добавил решение со списком Civa

1

Если все файлы называются mypic<number>.tif и нет файлов в каталоге, которые имеют различный формат имен, попробуйте с этим:

 FileInfo[] orderedFI = finfos 
      .OrderBy(fi => 
       // This will convert string representation of a number into actual integer 
       int.Parse(
        // this will extract the number from the filename 
        Regex.Match(Path.GetFileNameWithoutExtension(fi.Name), @"(\d+)").Groups[1].Value 
        )) 
      .ToArray(); 
+0

Я тоже пробовал, но получаю исключение. Но для меня это может быть нехорошо, потому что я делаю комикса, чтобы читать файлы изображений в их естественном порядке. Я думаю, что у меня просто отсутствует что-то очень важное. Например, как существующие писатели комиксов, написанные на C#, могут сделать это просто? – electricalbah

+0

Я вижу, что он работает только тогда, когда в каталоге нет других файлов. Поскольку я хочу, чтобы моя программа собирала все читаемые файлы изображений в одном списке независимо от имени, есть ли способ разделить файл, начиная с последних 3 файлов расширения, в качестве ссылки и применить ваш метод? – electricalbah

+0

Если необходимо отсортировать смесь имен файлов разных форматов, например '11ab.tif',' 1ab.tif', '2ab.tif'' abc.tif',' ab1.tif', 'ab11.tif' , 'ab2.tif', как вы хотите отсортировать их? –

0

Ведущие нули могут быть для вас решением. Это не ясно из вашего описания, если вы управляете кодом, который генерирует файлы. Если нет, вы можете использовать метод для сопоставления file1, ... file9 (например, регулярное выражение или длину файла) и переименовать их. Если вы управляете кодом, используйте форматтер, чтобы преобразовать число в строку с ведущими нулями (т. Е. Для двухзначных чисел {0:00}).

EDIT:

Чтобы получить направление воспроизведения со следующим проектом образца:

Предположим, что у вас есть в каталоге выполнения файлы: file1.txt, file2.txt, file10.txt и file20 .txt

foreach (string fn in System.IO.Directory.GetFiles(".", "file*.*")) 
    if (System.Text.RegularExpressions.Regex.IsMatch(fn, @"file\d.txt")) 
    System.IO.File.Move(fn, fn.Replace("file", "file0")); 

выше фрагмент кода будет переименовать fILE1.TXT в file01.txt и file2.txt к file02.txt.

+0

Я не контролирую файл, который генерирует файлы изображений, кроме того, я хочу также читать файлы комических изображений, которые имеют такую ​​же нумерацию. Я думаю, что ваш второй вариант может оказаться полезным. Но я новичок и могу ли вы предоставить мне образец? – electricalbah

+0

Вы проверили редактирование ответа? – 2013-03-07 10:10:54

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