2010-06-01 23 views
19

Estoy tratando de obtener todas las imágenes de la carpeta pero, esta carpeta también incluye subcarpetas. como/fotos/person1/y/fotos/person2/.I puede conseguir las fotos en la carpeta comoC#: Obtener todos los archivos de imagen en la carpeta

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

Pero, ¿cómo puedo obtener todas las fotos de todas las subcarpetas? Quiero decir que quiero obtener todas las fotos en/foto/directorio de una vez.

Respuesta

30

Eche un vistazo a la sobrecarga DirectoryInfo.GetFiles que toma un argumento SearchOption y pase SearchOption.AllDirectories para obtener los archivos incluyendo todos los subdirectorios.

Otra opción es utilizar Directory.GetFiles que tiene una sobrecarga que toma un argumento SearchOption así:

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

Por lo general prefieren la enumeración de cada directorio manualmente en lugar de utilizar SearchOption.AllDirectories, porque con SearchOption.AllDirectories la llamada se completa fallar si se produce una excepción de acceso no autorizada al enumerar una subcarpeta. https://github.com/faisalmansoor/MiscUtil/blob/master/EnumFiles/Program.cs –

3

Usted puede utilizar GetFiles

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

Es necesario la forma recursiva de GetFiles:

DirectoryInfo.GetFiles(pattern, searchOption); 

(especifique AllDirectories como SearchO pción)

Aquí hay un enlace para más información:

MSDN: DirectoryInfo.GetFiles

4

he encontrado la solución podría funcionar esto

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

GetFiles("*.jpg", SearchOption.AllDirectories) tiene un problema en Windows 7 . Si establece el directorio en c:\users\user\documents\, entonces tiene una excepción: debido a windows xp, win7 tiene enlaces como Música e Imágenes en la carpeta Documentos, pero estas carpetas no existen realmente, por lo que crea una excepción. Es mejor usar una forma recursiva con try..catch.

7

estoy usando GetFiles envueltos en el método, como a continuación:

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

es fácil de usar:

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

Hay una buena solución de una sola línea para este en un hilo similar:

get all files recursively then filter file extensions with LINQ

O si no se puede utilizar LINQ, utilice un RegEx para fil extensiones de archivo 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

Esto le permite utilizar el uso de la misma sintaxis y funcionalidad que Directory.GetFiles(path, pattern, options); excepto con una serie de patrones en lugar de sólo uno.

Así que también puede usarlo para realizar tareas como buscar todos los archivos que contienen la palabra "impuestos" que puede haber usado para guardar registros durante el año pasado (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(); 
    } 
} 

Para obtener todos los archivos de imagen en su unidad c lo implementará así.

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

Esto obtendrá la lista de todas las imágenes de las carpetas y subcarpetas y también se ocupará de la larga excepción del nombre de archivo en 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(); 

Esto podría le da el resultado perfecto de la búsqueda de archivos con su última mod

Cuestiones relacionadas