Подтвердить что ты не робот

С#: получение всех файлов изображений в папке

Я пытаюсь получить все изображения из папки, но в эту папку также входят подпапки. например /photos/person 1/and/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;
    }

Но как я могу получить все фотографии во всех подпапках? Я имею в виду, что я хочу получить все фотографии в/фото/каталог сразу.

4b9b3361

Ответ 1

Посмотрите на перегрузку DirectoryInfo.GetFiles, которая принимает SearchOption и передать 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

Я нашел решение, которое может работать

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

Ответ 4

Хорошее однострочное решение для этого в подобной теме:

рекурсивно возвращать все файлы, а затем расширять расширения файлов с помощью 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);
}

Ответ 5

Вы можете использовать GetFiles

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

Ответ 6

GetFiles("*.jpg", SearchOption.AllDirectories) имеет проблему в Windows 7. Если вы установили каталог в c:\users\user\documents\, у него есть исключение: из-за windows xp, win7 имеет такие ссылки, как Music и Pictures в папке Documents, но эти папки действительно не существуют, поэтому он создает исключение. Лучше использовать рекурсивный путь с помощью try..catch.

Ответ 7

Это позволяет использовать тот же синтаксис и функциональность, что и 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);

Ответ 8

Вам нужна рекурсивная форма GetFiles:

DirectoryInfo.GetFiles(pattern, searchOption);   

(укажите AllDirectories как SearchOption)

Здесь ссылка для получения дополнительной информации:

MSDN: DirectoryInfo.GetFiles

Ответ 9

Получает список всех изображений из папки и подпапок, а также заботится о длинном исключении имени файла в окнах.

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

Это может дать идеальный результат поиска файла с его последним модом