2016-05-27 7 views
-2

Wenn ein Verzeichnis mit Dateien, die an verschiedenen Daten erstellt werden. Ich möchte die Daten bekommen.Andere Daten im Verzeichnis

Ist es möglich, dies mit einer Linq-Abfrage zu tun, oder muss ich zuerst alle Dateien lesen und eine foreach-Schleife verwenden, um die Daten zu erhalten.

Beispiel:

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 

Ergebnis =

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

Dank

+3

Es ist nicht klar, ob die Daten * in * den Dateien oder nur den Dateisystemeinträgen entsprechen. Hast du schon etwas probiert? –

+0

Sie müssen die Dateieigenschaften abrufen, ich zeige, wie man das in dem Duplikat macht: 'DateTime CreatedDate = Convert.ToDateTime (GetSpecificFileProperties (filePath, 4));' Eine andere Möglichkeit kann man mit [FileInfo.GetCreationTime] (https : //msdn.microsoft.com/en-us/library/system.io.file.getcreationtime (v = vs.110) .aspx) und ein anderer ist der DOS-Befehl 'dir'. –

+0

Es gibt keine linq-Abfrage in irgendeiner der Antworten auf diese doppelte Frage, und auch die Antwort verwendet die Shell, die für die Frage des OP vollständig überkillt (und unnötig) ist. –

Antwort

0

Basiert auf dem Kommentar von @MatthewWatson.

habe ich

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

So kann ich die verschiedenen Terminen in meinem Verzeichnis verwendet erhalten folgende Linq Aussage machen.

0

Offensichtlich können Sie die Liste der Daten verarbeiten, ohne es zu iterieren, aber man kann Verwenden Sie Linq, um die Sequenz an erster Stelle zu erstellen:

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

, dass Ihnen eine Liste der FullName/CreationTime Paare geben, wo FullName der vollständige Pfad der Datei ist, und CreationTime ist die Zeit der Erstellung der Datei.

Sie können es wie so verarbeiten:

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

Wenn Sie nur die (einmalige) Daten, dass die Dateien auf erstellt wurden:

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

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

Schließlich, wenn Sie die Daten sein müssen bestellt:

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

(Und .OrderByDescending() für die umgekehrte Reihenfolge verwenden, natürlich.)

Wenn Sie es vorziehen Linq Abfragesyntax:

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

Oder die ganze Sache in einer Linq-Abfrage setzen (vielleicht ein bisschen unreadble hier bekommen, so dass Sie es als separate Abfragen behalten wollen könnte, aber das ist für Vollständigkeit):

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;