C#:获取文件夹中的所有图像文件

时间:2010-06-01 20:54:16

标签: c#

我正在尝试从文件夹中获取所有图像,但此文件夹还包含子文件夹。喜欢/ 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 /目录中获取所有照片。

10 个答案:

答案 0 :(得分:35)

查看带有DirectoryInfo.GetFiles参数的SearchOption重载,并通过SearchOption.AllDirectories获取包含所有子目录的文件。

另一个选择是使用Directory.GetFiles,它有一个带有SearchOption参数的重载:

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

答案 1 :(得分:15)

我正在使用以下方法包装的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);

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

我找到了可能有效的解决方案

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

答案 4 :(得分:2)

您可以使用GetFiles

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

答案 5 :(得分:2)

GetFiles("*.jpg", SearchOption.AllDirectories) windows7 处遇到问题。如果您将目录设置为c:\users\user\documents\,那么它有一个例外:由于windows xp win7 在Documents文件夹中包含音乐和图片等链接,但是theese文件夹没有确实存在,所以它创造了一个例外。最好使用try..catch的递归方式。

答案 6 :(得分:2)

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

因此,您也可以使用它来执行任务,例如查找包含单词&#34; tax&#34;您过去一年可能已经习惯了记录(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);

答案 7 :(得分:1)

您需要GetFiles的递归形式:

DirectoryInfo.GetFiles(pattern, searchOption);   

(将AllDirectories指定为SearchOption)

以下是更多信息的链接:

MSDN: DirectoryInfo.GetFiles

答案 8 :(得分: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;
  }

答案 9 :(得分:-1)

String namePattern = "[^\\p{P}|^\\d+]+";

//true if name contains only alphabets, false - otherwise
boolean result = userName.matches(namePattern);

这可以为您提供使用最新mod

搜索文件的完美结果