【问题标题】:C#:Getting all image files in folderC#:获取文件夹中的所有图像文件
【发布时间】:2021-07-15 22:48:00
【问题描述】:

我正在尝试从文件夹中获取所有图像,但是该文件夹还包括子文件夹。像 /photos/person1/ 和 /photos/person2/ 。我可以在文件夹中获取照片

  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/ 目录中的所有照片。

【问题讨论】:

    标签: c#


    【解决方案1】:

    查看采用SearchOption 参数的DirectoryInfo.GetFiles 重载并传递 SearchOption.AllDirectories 以获取包含所有子目录的文件。

    另一种选择是使用Directory.GetFiles,它有一个重载,也接受SearchOption 参数:

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

    【讨论】:

    【解决方案2】:

    我正在使用 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", "svg" };
    var files = GetFilesFrom(searchFolder, filters, false);
    

    【讨论】:

      【解决方案3】:

      在类似的线程上有一个很好的单线解决方案:

      get all files recursively then filter file extensions with LINQ

      或者如果无法使用 LINQ,则使用 RegEx 过滤文件扩展名:

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

      【讨论】:

        【解决方案4】:

        我找到了可能可行的解决方案

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

        【讨论】:

          【解决方案5】:

          您可以使用 GetFiles

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

          【讨论】:

            【解决方案6】:

            您需要 GetFiles 的递归形式:

            DirectoryInfo.GetFiles(pattern, searchOption);   
            

            (将 AllDirectories 指定为 SearchOption)

            这里是更多信息的链接:

            MSDN: DirectoryInfo.GetFiles

            【讨论】:

              【解决方案7】:

              GetFiles("*.jpg", SearchOption.AllDirectories)windows7 上有问题。如果你将目录设置为c:\users\user\documents\,那么它有一个例外:因为windows xpwin7在Documents文件夹中有Music和Pictures之类的链接,但是这些文件夹并不存在,所以它会创建一个异常。最好使用try..catch 的递归方式。

              【讨论】:

                【解决方案8】:

                这允许您使用与Directory.GetFiles(path, pattern, options); 相同的语法和功能,除了使用一组模式而不是一个模式。

                因此,您还可以使用它来执行任务,例如查找所有包含“taxes”一词的文件,这些文件您在过去一年中可能用于保存记录(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);
                

                【讨论】:

                  【解决方案9】:

                  这将从文件夹和子文件夹中获取所有图像的列表,并且还可以处理 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;
                    }
                  

                  【讨论】:

                    【解决方案10】:
                    var files = new DirectoryInfo(path).GetFiles("File")
                        .OrderByDescending(f => f.LastWriteTime).First();
                    

                    这可以为您提供使用最新 mod 搜索文件的完美结果

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-09-29
                      • 1970-01-01
                      • 2013-06-11
                      • 1970-01-01
                      • 2015-08-30
                      • 2022-01-25
                      相关资源
                      最近更新 更多