2010-12-01 6 views
2

У меня есть список файлов, которые я хотел бы сортировать по дате. Предостережение состоит в том, что каждый файл в списке содержит дату как часть имени файла, я хочу сортировать файлы на основе этой даты. Причина этого заключается в том, что дата в строке имени файла коррелирует с содержимым, находящимся в файле, то есть фактическое свойство даты каждого файла, дата, изменение, доступ и т. Д. Может быть изменено всякий раз, когда файл перемещается или изменить, и поэтому я не могу полагаться на это для своих целей. Я создаю пользовательский сопоставитель для использования в методе сортировки списка, но мне хотелось узнать, есть ли у кого-нибудь другие лучшие или уникальные подходы к этому. Заранее спасибо.Сортировка файла по содержимому его имени файла

UPDATE:

В ответ на комментарий Саида, имя файла имеет следующий формат:

{Test Name}_{YYYYMMDD}_{HHmmSS}.txt 

Где YYYYMMDD и HHMMSS являются дата и время, соответственно.

UPDATE 2:

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

public class TDRDateTimeComparer : IComparer<FileInfo> 
{ 
    public int Compare(FileInfo x, FileInfo y) 
    { 
     //Return if both strings are null or empty 
     if (string.IsNullOrEmpty(x.Name) && string.IsNullOrEmpty(y.Name)) 
     { 
      return 0; 
     } 
     Regex rDateTime = new Regex(@"(19|20|21)\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])_([0-1]\d|2[0-3])([0-5]\d)([0-5]\d)"); 

     /* NOTE: File names will already have been validated at this point, so no need to validate the date/time again.*/ 
     string date1 = rDateTime.Match(x.Name).Value, date2 = rDateTime.Match(y.Name).Value; 
     DateTime d1 = DateTime.ParseExact(date1, "yyyyMMdd_HHmmss", null), d2 = DateTime.ParseExact(date2, "yyyyMMdd_HHmmss", null); 

     return d1.CompareTo(d2); 
    } 
} 
+0

Каковы ваши форматы имен файлов и что вы сделали для его улучшения? – 2010-12-01 21:30:08

ответ

2

Я бы сказал, что пользовательский сравнитель - это путь. Просто используйте регулярное выражение для извлечения деталей даты, затем создайте DateTime и сравните их.

+0

Вот пример этого: http://en.csharp-online.net/Comparer_class – BeemerGuy 2010-12-01 21:31:32

1

Вы можете использовать метод расширения OrderBy и указать значение для сортировки. Пример:

list = list.OrderBy(f => DateTime.Parse(Path.GetFileName(f.Name))).ToList(); 
+2

Учитывая замечание OP о том, что * «каждый файл в списке содержит дату ** как часть ** своего [sic] имени файла «*, вам нужно будет сделать немного больше работы, чем это ... :) – 2010-12-01 21:34:35

1

Я имел обыкновение работать в системе, генерируемые файлы с временем даты & закодированного в имя файла. Формат даты установлен в старый формат файла DOS 8.2.

Из-за соглашения об именах при перечне файлов в файловой системе они были правильно отсортированы. Если у вас есть такой контроль, вы можете подумать об этом. т. е. называя его YYYYMMDD ... сортирует по дате по умолчанию.

Дополнительный код не требуется.

+0

, как вы уверены, что они отсортированы по названию? могут быть отсортированы по типу или другим вещам. – 2010-12-01 21:47:11

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