2009-11-10 7 views
1

Je ne pense pas que System.Collections.ObjectModel ait un tri ou un ordre par fonction.Par date de fichier dans la collection

J'ai une liste de fichiers et je voudrais trier par la date du fichier.

Dim list AS System.Collections.ObjectModel.ReadOnlyCollection(Of String) 
list = My.Computer.FileSystem.GetFiles("C:\SearchFolder" _ 
    , FileIO.SearchOption.SearchByTopLevelOnly _ 
    , "TheFileName*.txt") 

Dim sTheLastFile AS String 

sTheLastFile = list.Max() 

Ceci renvoie le dernier fichier, mais basé sur le nom du fichier et non sur la date. Je pense que je dois ajouter .OrderBy (... juste ne peut pas obtenir cette partie.

Répondre

1
using System.IO; 

public static void Main() 
{ 
    DirectoryInfo di = new DirectoryInfo("c:\\temp\\"); 
    FileSystemInfo[] files = di.GetFileSystemInfos("*.mp3"); 
    printFiles(files); 

    Array.Sort(files, CompareFileByDate); 
    printFiles(files); 

} 

public static int CompareFileByDate(FileSystemInfo f1, FileSystemInfo f2) 
{ 
    return DateTime.Compare(f1.LastWriteTime, f2.LastWriteTime); 
} 

public static void printFiles(FileSystemInfo[] files) 
{ 
    foreach(FileSystemInfo file in files) 
    { 
     Console.WriteLine(file.Name); 
    } 
    Console.WriteLine("********************************"); 
} 

Voir si cela vous aide à tous.

Je l'ai utilisé LastWriteTime la propriété. Vous pouvez choisir selon fonctionne pour vous (ou CreationTimeLastAccessTime)

EDIT:. Bien sûr, cela peut être converti en syntaxe plus compacte en utilisant C# 3.0 support & pour les expressions lambda

EDIT2:.

from file in new DirectoryInfo(@"c:\temp\").GetFileSystemInfos("*.mp3") 
orderby file.LastWriteTime 
select file 

EDIT3: la version vb.net de ce qui précède C# code

from file in new DirectoryInfo("c:\temp\").GetFileSystemInfos("*.mp3") _ 
order by file.LastWriteTime _ 
select file 

de EDIT4: Est-ce que vous cherchez?
Cela vous donnera le max. date du LastWriteTime de tous les fichiers * .mp3.

(from file in new DirectoryInfo("c:\temp\").GetFileSystemInfos("*.mp3") _ 
order by file.LastWriteTime descending _ 
select file.LastWriteTime).Take(1) 

OU

(from file in new DirectoryInfo("c:\temp\").GetFileSystemInfos("*.mp3") _ 
select file.LastWriteTime).Max() 
+0

Comment puis-je obtenir la commande par fichier. LastWriteTime dans mon code? – JeffO

+0

Aucun des exemples de code ci-dessus ne vous aide? Pourriez-vous éditer votre question avec ce qui est attendu, en gardant à l'esprit l'exemple de code affiché dans cette réponse? – shahkalpesh

0

Pour ce s'il vous plaît essayez ce qui suit ...

installation d'une nouvelle classe qui implémente l'interface IComparer. Cela sera utilisé pour effectuer les comparaisons. IComparer permet de personnaliser l'ordre de tri d'une collection. Notez que l'exemple ci-dessous utilise le LastWriteTime comme base de comparaison, mais cela peut être changé pour n'importe quelle propriété que vous voyez.

Public Class clsCompareFileInfo 
    Implements IComparer 
    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare 
     Dim File1 As FileInfo 
     Dim File2 As FileInfo 

     File1 = DirectCast(x, FileInfo) 
     File2 = DirectCast(y, FileInfo) 

     Compare = DateTime.Compare(File1.LastWriteTime, File2.LastWriteTime) 
    End Function 
End Class 

Ensuite, récupérez la collection de fichiers et effectuez les actions suivantes pour trier les fichiers en conséquence.

Dim dirinfo As DirectoryInfo = New DirectoryInfo("C:\SearchFolder") 
     Dim allFiles() As FileInfo = dirinfo.GetFiles("TheFileName*.txt", SearchOption.TopDirectoryOnly) 
     Array.Sort(allFiles, New clsCompareFileInfo) 
     For Each fl As FileInfo In allFiles 
      MsgBox(fl.FullName.ToString()) 
     Next 
+0

Votre première ligne est en train de créer une erreur: La valeur du type 'System.Collections.ObjectModel.ReadOnlyCollection (Of String)' ne peut pas être convertie en 'tableau 1Dimensional de System.IO.FileInfo' – JeffO

+0

Le code a été modifié, veuillez essayer ce qui précède – Jakkwylde

0

Avec cette classe, vous pouvez commander les fichiers en utilisant les critères de appropiate (vous devez ajouter des classes d'aide privées pour tous les critères que vous aviez besoin ;-))


Imports System.IO 

Class FilesTools 
    Private Class HelperSortByLastWriteTimeAsc 
     Implements IComparer(Of FileInfo) 

     Public Function Compare(ByVal x As System.IO.FileInfo, _ 
           ByVal y As System.IO.FileInfo) As Integer Implements System.Collections.Generic.IComparer(Of System.IO.FileInfo).Compare 
      Return Date.Compare(x.LastWriteTime, y.LastWriteTime) 
     End Function 
    End Class 

    Private Class HelperSortByLastWriteTimeDesc 
     Implements IComparer(Of FileInfo) 

     Public Function Compare(ByVal x As System.IO.FileInfo, _ 
           ByVal y As System.IO.FileInfo) As Integer Implements System.Collections.Generic.IComparer(Of System.IO.FileInfo).Compare 
      Return Date.Compare(y.LastWriteTime, x.LastWriteTime) 
     End Function 
    End Class 

    Public Shared Function sortByLastTime() As IComparer(Of FileInfo) 
     Return New HelperSortByLastWriteTimeAsc 
    End Function 

    Public Shared Function sortByLastTimeDesc() As IComparer(Of FileInfo) 
     Return New HelperSortByLastWriteTimeDesc 
    End Function 

    Public Shared Function GetFilesSorted(ByVal path As String, _ 
              ByVal sort As IComparer(Of FileInfo)) As FileInfo() 
     Dim info As FileInfo() 
     info = New DirectoryInfo(path).GetFileSystemInfos() 

     Array.Sort(Of FileInfo)(info, sort) 

     Return info 
    End Function 

End Class 
Questions connexes