2010-06-01 27 views
19

Sto cercando di ottenere tutte le immagini dalla cartella, ma questa cartella include anche le sottocartelle. come/foto/person1/e/foto/persona2/.I può ottenere le foto nella cartella comeC#: recupero di tutti i file immagine nella cartella

path= System.IO.Directory.GetCurrentDirectory() + "/photo/" + groupNO + "/"; 
public List<String> GetImagesPath(String folderName) 
    { 

     DirectoryInfo Folder; 
     FileInfo[] Images; 

     Folder = new DirectoryInfo(folderName); 
     Images = Folder.GetFiles(); 
     List<String> imagesList = new List<String>(); 

     for (int i = 0; i < Images.Length; i++) 
     { 
      imagesList.Add(String.Format(@"{0}/{1}", folderName, Images[i].Name)); 
      // Console.WriteLine(String.Format(@"{0}/{1}", folderName, Images[i].Name)); 
     } 


     return imagesList; 
    } 

Ma come posso ottenere tutte le foto in tutte le sottocartelle? Voglio dire, voglio ottenere tutte le foto in/foto/directory in una volta.

risposta

30

Dai un'occhiata al sovraccarico DirectoryInfo.GetFiles che accetta un argomento SearchOption e passa a SearchOption.AllDirectories per ottenere i file che includono tutte le sottodirectory.

Un'altra opzione è quella di utilizzare Directory.GetFiles che ha un overload che accetta un argomento SearchOption così:

return Directory.GetFiles(folderName, "*.*", SearchOption.AllDirectories) 
       .ToList(); 
+0

io di solito preferisco enumerare ogni directory manualmente piuttosto che usare SearchOption.AllDirectories, perché con SearchOption.AllDirectories la chiamata sarà completa fallire se si verifica una eccezione UnauthorizedAccessExcement durante l'enumerazione di una sottocartella. https://github.com/faisalmansoor/MiscUtil/blob/master/EnumFiles/Program.cs –

3

È possibile utilizzare GetFiles

GetFiles("*.jpg", SearchOption.AllDirectories) 
1

È necessario sotto forma ricorsiva di GetFiles:

DirectoryInfo.GetFiles(pattern, searchOption); 

(specificare AllDirectories come SearchO ption)

Ecco un link per maggiori informazioni:

MSDN: DirectoryInfo.GetFiles

4

ho trovato la soluzione questo potrebbe funzionare

   foreach (string img in Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"*.bmp" + "*.jpg" + "SO ON")) 
2

GetFiles("*.jpg", SearchOption.AllDirectories) ha un problema a windows7. Se si imposta la directory su c:\users\user\documents\, si ha un'eccezione: a causa di windows xp, win7 ha collegamenti come Musica e Immagini nella cartella Documenti, ma tali cartelle non esistono realmente, quindi crea un'eccezione. Meglio usare un modo ricorsivo con try..catch.

7

sto usando GetFiles avvolti nel metodo come di seguito:

public static String[] GetFilesFrom(String searchFolder, String[] filters, bool isRecursive) 
{ 
    List<String> filesFound = new List<String>(); 
    var searchOption = isRecursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; 
    foreach (var filter in filters) 
    { 
     filesFound.AddRange(Directory.GetFiles(searchFolder, String.Format("*.{0}", filter), searchOption)); 
    } 
    return filesFound.ToArray(); 
} 

E 'facile da usare:

String searchFolder = @"C:\MyFolderWithImages"; 
var filters = new String[] { "jpg", "jpeg", "png", "gif", "tiff", "bmp" }; 
var files = GetFilesFrom(searchFolder, filters, false); 
4

C'è una buona soluzione one-liner per questo su un thread simile:

get all files recursively then filter file extensions with LINQ

Oppure se LINQ non può essere utilizzato, quindi utilizzare una RegEx per fil le estensioni dei file ter:

var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories) 

List<string> imageFiles = new List<string>(); 
foreach (string filename in files) 
{ 
    if (Regex.IsMatch(filename, @".jpg|.png|.gif$")) 
     imageFiles.Add(filename); 
} 
1

Questo consente di utilizzare utilizzare la stessa sintassi e funzionalità Directory.GetFiles(path, pattern, options); se non con una serie di modelli invece di uno solo.

Così puoi usarlo anche per svolgere compiti come trovare tutti i file che contengono la parola "tasse" che potresti aver usato per conservare i record nell'ultimo anno (xlsx, xls, odf, csv, tsv, doc, docx , pdf, txt ...).

public static class CustomDirectoryTools { 
    public static string[] GetFiles(string path, string[] patterns = null, SearchOption options = SearchOption.TopDirectoryOnly) { 
     if(patterns == null || patterns.Length == 0) 
      return Directory.GetFiles(path, "*", options); 
     if(patterns.Length == 1) 
      return Directory.GetFiles(path, patterns[0], options); 
     return patterns.SelectMany(pattern => Directory.GetFiles(path, pattern, options)).Distinct().ToArray(); 
    } 
} 

Al fine di ottenere tutti i file di immagine sul tuo disco c lo implementeresti in questo modo.

string path = @"C:\"; 
string[] patterns = new[] {"*.jpg", "*.jpeg", "*.jpe", "*.jif", "*.jfif", "*.jfi", "*.webp", "*.gif", "*.png", "*.apng", "*.bmp", "*.dib", "*.tiff", "*.tif", "*.svg", "*.svgz", "*.ico", "*.xbm"}; 
string[] images = CustomDirectoryTools.GetFiles(path, patterns, SearchOption.AllDirectories); 
0

Questo otterrà l'elenco di tutte le immagini dalla cartella e sottocartelle e si cura anche per l'eccezione del nome file lungo in Windows.

// To handle long folder names Pri external library is used. 
// Source https://github.com/peteraritchie/LongPath  
using Directory = Pri.LongPath.Directory; 
using DirectoryInfo = Pri.LongPath.DirectoryInfo; 
using File = Pri.LongPath.File; 
using FileInfo = Pri.LongPath.FileInfo; 
using Path = Pri.LongPath.Path; 

// Directory and sub directory search function 
public void DirectoryTree(DirectoryInfo dr, string searchname) 
     { 
      FileInfo[] files = null; 
      var allFiles = new List<FileInfo>(); 
      try 
      { 
       files = dr.GetFiles(searchname); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 

      if (files != null) 
      { 
       try 
       { 
        foreach (FileInfo fi in files) 
        { 
         allFiles.Add(fi); 

         string fileName = fi.DirectoryName + "\\" + fi.Name; 
         string orgFile = fileName; 
        } 
        var subDirs = dr.GetDirectories(); 

        foreach (DirectoryInfo di in subDirs) 
        { 
         DirectoryTree(di, searchname); 
        } 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 

      } 
     } 

    public List<String> GetImagesPath(String folderName) 
    { 
     var dr = new DirectoryInfo(folderName); 
     string ImagesExtensions = "jpg,jpeg,jpe,jfif,png,gif,bmp,dib,tif,tiff"; 
     string[] imageValues = ImagesExtensions.Split(','); 
     List<String> imagesList = new List<String>(); 

       foreach (var type in imageValues) 
       { 
        if (!string.IsNullOrEmpty(type.Trim())) 
        { 
         DirectoryTree(dr, "*." + type.Trim()); 
         // output to list 
         imagesList.Add = DirectoryTree(dr, "*." + type.Trim()); 
        } 

       } 
     return imagesList; 
    } 
-1
var files = new DirectoryInfo(path).GetFiles("File") 
    .OrderByDescending(f => f.LastWriteTime).First(); 

Questo potrebbe ti dà il risultato perfetto di cercare file con il suo ultimo mod

Problemi correlati