2016-05-27 3 views
-2

Если у вас есть каталог с файлами, созданными в разные даты. Я хочу получить даты.Различные даты в каталоге

Возможно ли это сделать с помощью запроса linq, или я должен сначала прочитать все файлы и использовать цикл foreach для получения дат.

Пример:

List =

File_1 6/03/2016 
File_2 6/03/2016 
File_3 6/03/2016 
File_4 6/03/2016 
File_5 15/04/2016 
File_6 21/04/2016 
File_7 21/04/2016 
File_8 21/04/2016 

Result =

6/03/2016 
15/04/2016 
21/04/2016 

Благодаря

+3

Неясно, являются ли даты * в * файлах или только в файлах файловой системы. Вы еще что-нибудь пробовали? –

+0

Вам нужно получить свойства файла, я покажу, как это сделать в дубликате: 'DateTime CreatedDate = Convert.ToDateTime (GetSpecificFileProperties (filePath, 4));' Еще один способ вы можете сделать это с помощью [FileInfo.GetCreationTime] (https : //msdn.microsoft.com/en-us/library/system.io.file.getcreationtime (v = vs.110) .aspx), а другой - DOS Command 'dir'. –

+0

В любом ответе на этот дублированный вопрос нет запроса linq, а также ответ использует оболочку, которая является полным излишним (и ненужным) для вопроса OP. –

ответ

0

Основано на комментарии от @MatthewWatson.

меня сделать следующее заявление Linq

var dateInfo = Directory.EnumerateFiles(Dir).Select(filename => new FileInfo(filename)).Select(i => new { i.LastWriteTime }).GroupBy(g => g.LastWriteTime.Date); 

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

0

Очевидно, вы не можете обрабатывать список дат без перебора, но вы можете используйте Linq для создания последовательности в первую очередь, например:

var dateInfo = 
    Directory.EnumerateFiles(directoryName) 
    .Select(filename => new FileInfo(filename)) 
    .Select(info => new {info.Name, info.CreationTime}); 

Это даст вам список FullName/CreationTime пар, где FullName полный путь к файлу, и CreationTime время создания файла.

Вы можете обработать его следующим образом:

foreach (var item in dateInfo) 
    Console.WriteLine($"{item.FullName} created on {item.CreationTime}"); 

Если вы просто хотите (уникальный) даты, что файлы были созданы на:

var uniqueDates = dateInfo.GroupBy(x => x.CreationTime.Date).Select(y => y.Key); 

foreach (var date in uniqueDates) 
    Console.WriteLine(date); 

Наконец, если вам нужны даты, чтобы быть скомандовал:

var uniqueDates = 
    dateInfo.GroupBy(x => x.CreationTime.Date) 
    .Select(y => y.Key) 
    .OrderBy(z => z); 

(И использовать .OrderByDescending() для обратной последовательности, конечно.)

Если вы предпочитаете Linq синтаксис запроса:

var uniqueDates = 
    from date in dateInfo 
    group date by date.CreationTime.Date into g 
    orderby g.Key 
    select g.Key; 

или положить всю вещь в одном запросе Linq (возможно получение немного unreadble здесь, так что вы можете сохранить его в виде отдельных запросов, но это для полноты):

var uniqueDates = 
    from date in 
     from file in Directory.EnumerateFiles(directoryName) 
     select new FileInfo(file).CreationTime 
    group date by date.Date into g 
    orderby g.Key 
    select g.Key; 
Смежные вопросы