2010-06-01 18 views
19

Próbuję pobrać wszystkie obrazy z folderu, ale ten folder zawiera także podfoldery. jak/zdjęcia/PERSON1/i/zdjęcia/PERSON2/.I można uzyskać zdjęcia w folderze jakC#: Pobieranie wszystkich plików obrazów do folderu

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; 
    } 

Ale w jaki sposób można uzyskać wszystkie zdjęcia we wszystkich podfolderach? Chodzi mi o to, że chcę jednocześnie umieścić wszystkie zdjęcia w katalogu/photo /.

Odpowiedz

30

Spójrz na przeciążenie DirectoryInfo.GetFiles, które pobiera argument SearchOption i przekazuj SearchOption.AllDirectories, aby pobrać pliki, w tym wszystkie podkatalogi.

Inną opcją jest użycie Directory.GetFiles który ma przeciążenie, że trwa SearchOption argumentu, a także:

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

I zazwyczaj wolą wyliczanie każdy katalog ręcznie zamiast przy użyciu SearchOption.AllDirectories, ponieważ z SearchOption.AllDirectories pełna połączenie zostanie niepowodzenie, jeśli wystąpi wyjątek UnauthorizedAccessException podczas wyliczania podfolderu. https://github.com/faisalmansoor/MiscUtil/blob/master/EnumFiles/Program.cs –

3

Można użyć GetFiles

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

Trzeba rekurencyjnej formy GetFiles:

DirectoryInfo.GetFiles(pattern, searchOption); 

(należy podać AllDirectories jako SearchO ption)

Oto link, aby uzyskać więcej informacji:

MSDN: DirectoryInfo.GetFiles

4

znalazłem rozwiązanie to może działać

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

GetFiles("*.jpg", SearchOption.AllDirectories) ma problem w Windows7. Jeśli ustawisz katalog na c:\users\user\documents\, ma on wyjątek: z powodu windows xp, win7 ma łącza takie jak Muzyka i obrazy w folderze Dokumenty, ale te foldery tak naprawdę nie istnieją, więc tworzy wyjątek. Lepiej używać rekurencyjnego sposobu z try..catch.

7

Używam GetFiles zapakowane w sposób jak poniżej:

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(); 
} 

Jest łatwy w użyciu:

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

Jest to dobre rozwiązanie jedna wkładka na to na podobnym wątku:

get all files recursively then filter file extensions with LINQ

Lub jeśli nie można użyć LINQ, użyj RegEx do fil Rozszerzenia plików 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

To pozwala na użycie użyć tej samej składni i funkcjonalność jak Directory.GetFiles(path, pattern, options); wyjątkiem z tablicą wzorów zamiast jednego.

Można go również użyć do wykonywania zadań, takich jak znajdowanie wszystkich plików zawierających słowo "podatki", które mogły być używane do przechowywania rekordów w ciągu ostatniego roku (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(); 
    } 
} 

Aby uzyskać wszystkie pliki obrazów na dysku c, należy zaimplementować go w ten sposób.

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

Otrzyma listę wszystkich obrazów z folderów i podfolderów, a także zajmie się wyjątkiem długich nazw plików w oknach.

// 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(); 

To dało daje doskonały wynik poszukiwania plik z jego najnowszy mod

Powiązane problemy