2009-08-28 5 views
0

Je crée une visionneuse d'image simple, mais je veux faire un tri des images par LastTimeWrite. J'ai un OpenFileDialog pour charger des photos, quand je choisis l'image dans le dossier alors ProcessDirectory() est appelé.trier les images par LastTimeWrite

private void ProcessDirectory() 
     { 
      FileTypes = new ArrayList(); 
      FileTypes.Add("*.JPG"); 
      FileTypes.Add("*.JPEG"); 
      FileTypes.Add("*.GIF"); 
      FileTypes.Add("*.BMP"); 
      FileTypes.Add("*.PNG"); 
      FileTypes.Add("*.TIF"); 
      FileTypes.Add("*.TIFF"); 

      string[] szFiles; 
      FileArray = new ArrayList(); 

      foreach (string szType in FileTypes) 
      { 
       szFiles = Directory.GetFiles(Directory.GetCurrentDirectory(), szType); 
       if (szFiles.Length > 0) 
        FileArray.AddRange(szFiles); 
       //switch (SortImg) 
       //{ 
       // case ("Asc"): 
       //  FileArray.Sort(); 
       //  break; 
       // case("Date"): 
       string[] MyString = new string[szFiles.Length];  
         DateTime[] creationTimes = new DateTime[szFiles.Length]; 
         for (int i = 0; i < szFiles.Length; i++) 
         { 
          creationTimes[i] = new FileInfo(szFiles[i]).LastWriteTime; 
          //creationTimes[i].ToString("yyyy-MM-dd HH:mm tt"); 
         } 

         for (int i = 0; i < szFiles.Length; i++) 
          MyString[i] = Convert.ToString(creationTimes[i].ToString("yyyy-MM-dd HH:mm tt")); 

       FileArray.Sort(); 
         listBox1.Items.AddRange(MyString); 
         FileArray.AddRange(MyString); 
... 
       } 

Répondre

2

J'utiliser une approche légèrement différente (cela nécessite C# 3):

List<FileInfo> files = new List<FileInfo>(); 
List<string> fileTypes = new List<string>() 
{ 
    "*.jpg", 
    "*.jpeg", 
    "*.gif", 
    "*.bmp", 
    "*.png", 
    "*.tif", 
    "*.tiff" 
}; 

DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory()); 
foreach (string fileType in fileTypes) 
{ 
    files.AddRange(dir.GetFiles(fileType)); 
} 

var sortedFiles = files.OrderBy(f => f.LastWriteTime); 

foreach (FileInfo file in sortedFiles) 
{ 
    // do something with the FileInfo 
} 

Si vous utilisez C# 2 (si vous n'avez pas accès à lambdas et LINQ), il pourrait ressembler à ceci:

Directory.SetCurrentDirectory(@"C:\23055329\files\desktop wallpaper"); 
List<FileInfo> files = new List<FileInfo>(); 
List<string> fileTypes = new List<string>() 
{ 
    "*.jpg", 
    "*.jpeg", 
    "*.gif", 
    "*.bmp", 
    "*.png", 
    "*.tif", 
    "*.tiff" 
}; 

DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory()); 
foreach (string fileType in fileTypes) 
{ 
    files.AddRange(dir.GetFiles(fileType)); 
} 

files.Sort(new Comparison<FileInfo>(delegate(FileInfo x, FileInfo y) 
{ 
    return x.LastWriteTime.CompareTo(y.LastWriteTime); 
})); 

foreach (FileInfo file in files) 
{ 
    // do something with the FileInfo 
    Console.WriteLine(file.ToString()); 
} 
+0

Merci beaucoup pour votre réponse, Fredrik. Vos exemples fonctionnent très bien, mais je ne vois pas comment montrer des images triées, je ne peux montrer que leurs dates FielInfo en format de chaîne. Je pense qu'il devrait y avoir un autre tableau pour les fichiers triés qui seront affichés dans pictureBox, mais comment remplir ce nouveau tableau avec votre tableau 'fichiers' rempli de FileInfos triés. Je suis trop stupide pour ça. Avez-vous une idée? Je vous remercie. –

+0

Si vous souhaitez afficher les images à la place, vous pouvez utiliser la méthode 'FromFile' sur la classe' Image' pour charger le fichier, puis affecter l'image à la propriété 'Image' d'un objet' PictureBox'. Vous aurez bien sûr besoin d'un PictureBox pour chaque image. –