2010-06-01 194 views
19

我想從文件夾中獲取所有圖像,但該文件夾中還包含子文件夾。像/照片/ PERSON1 /和/照片/ PERSON2 /。我可以拿到照片的文件夾一樣C#:獲取文件夾中的所有圖像文件

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

,但我怎麼能得到所有子文件夾中的所有照片?我的意思是我想一次獲取/ photo /目錄中的所有照片。

回答

30

看看DirectoryInfo.GetFiles重載,它需要一個SearchOption參數並傳遞SearchOption.AllDirectories以獲取包含所有子目錄的文件。

另一種選擇是使用Directory.GetFiles具有過載,需要一個SearchOption參數,以及:

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

我通常喜歡列舉的每個目錄手動而不是使用SearchOption.AllDirectories,因爲SearchOption.AllDirectories完整的通話將枚舉子文件夾時發生UnauthorizedAccessException,則失敗。 https://github.com/faisalmansoor/MiscUtil/blob/master/EnumFiles/Program.cs – 2013-08-19 21:10:52

3

您可以使用GetFiles的

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

您需要的GetFiles的遞歸形式:

DirectoryInfo.GetFiles(pattern, searchOption); 

(指定AllDirectories作爲SearchO ption)

這裏有一個鏈接,瞭解更多信息:

MSDN: DirectoryInfo.GetFiles

4

我找到了解決辦法,這可能工作

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

GetFiles("*.jpg", SearchOption.AllDirectories)有一個問題在的windows7。如果您將目錄設置爲c:\users\user\documents\,則它有一個例外:由於windows xp,win7在文檔文件夾中有類似音樂和圖片的鏈接,但這些文件夾並不真正存在,因此它會創建一個例外。最好使用try..catch的遞歸方式。

7

我使用的GetFiles裹着方法象下面這樣:

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

它易於使用:

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

有這個一個很好的班輪解決方案上的類似螺紋:

get all files recursively then filter file extensions with LINQ

或者如果不能使用LINQ,那麼使用RegEx對fil之三的文件擴展名:

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

這允許您使用使用相同的語法和功能Directory.GetFiles(path, pattern, options);除了與模式,而不只是一個數組。

因此,您還可以使用它執行諸如查找包含過去一年中可能用於保存記錄的「稅」字的所有文件的任務(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(); 
    } 
} 

爲了讓你的C盤上的所有圖像文件,你會像這樣實現它。

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

這將從文件夾和子文件夾中獲得所有圖像的列表,並且它還處理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(); 

這可以讓你用搜索文件的完美的結果了其最新的MOD

相關問題