recursive from example c# .net fileinfo getfiles

c# - from - GetFiles con mĂșltiples extensiones



fileinfo c# (8)

Posible duplicado:
¿Puedes llamar a Directory.GetFiles () con múltiples filtros?

¿Cómo se filtra en más de una extensión?

He intentado:

FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp"); FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");


¿Por qué no crear un método de extensión? Eso es más legible.

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions) { if (extensions == null) throw new ArgumentNullException("extensions"); IEnumerable<FileInfo> files = Enumerable.Empty<FileInfo>(); foreach(string ext in extensions) { files = files.Concat(dir.GetFiles(ext)); } return files; }

EDITAR: una versión más eficiente:

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions) { if (extensions == null) throw new ArgumentNullException("extensions"); IEnumerable<FileInfo> files = dir.EnumerateFiles(); return files.Where(f => extensions.Contains(f.Extension)); }

Uso:

dInfo.GetFilesByExtensions(".jpg",".exe",".gif");


A continuación, recupera los archivos jpg, tiff y bmp y le proporciona un IEnumerable<FileInfo> sobre el que puede iterar:

var files = dinfo.GetFiles("*.jpg") .Concat(dinfo.GetFiles("*.tiff")) .Concat(dinfo.GetFiles("*.bmp"));

Si realmente necesitas una matriz, simplemente pega .ToArray() al final de esto.


Estoy usando la siguiente forma para listar archivos.

''////cblSourceFiles is CHECK BOX LIST CONTROL <_asp:CheckBoxList ID="cblSourceFiles" runat="server" DataTextField="Name" DataValueField="Name" /> cblSourceFiles.DataSource = (New IO.DirectoryInfo(Path)).EnumerateFiles().Where(AddressOf ValidExtensions) cblSourceFiles.DataBind() Private Function ValidExtensions(ByVal pFi As System.IO.FileInfo, ByVal pSt As Integer) As Boolean Dim mRet As Boolean = False For Each mExt As String In ".jpg,.png".Split(",") ''//// WebConfig.AllowedFiletypes If pFi.Extension.ToLower = mExt.ToLower Then mRet = True Exit For End If Next Return mRet End Function


No estoy seguro si eso es posible. La reference MSDN GetFiles indica un patrón de búsqueda, no una lista de patrones de búsqueda.

Podría inclinarme a buscar cada lista por separado y "foreach" en una lista final.


No puede hacer eso, porque GetFiles solo acepta un único patrón de búsqueda. En su lugar, puede llamar a GetFiles sin patrón y filtrar los resultados en código:

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" }; FileInfo[] files = dinfo.GetFiles() .Where(f => extensions.Contains(f.Extension.ToLower())) .ToArray();

Si está trabajando con .NET 4, puede usar el método EnumerateFiles para evitar cargar todos los objetos FileInfo en la memoria de una vez:

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" }; FileInfo[] files = dinfo.EnumerateFiles() .Where(f => extensions.Contains(f.Extension.ToLower())) .ToArray();


Puede obtener todos los archivos y luego filtrar la matriz:

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dirInfo, params string[] extensions) { var allowedExtensions = new HashSet<string>(extensions, StringComparer.OrdinalIgnoreCase); return dirInfo.EnumerateFiles() .Where(f => allowedExtensions.Contains(f.Extension)); }

Esto será (marginalmente) más rápido que cualquier otra respuesta aquí.
En .Net 3.5, reemplace EnumerateFiles con GetFiles (que es más lento).

Y úsalo así:

var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4");


Puedes usar el método LINQ Union:

dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();


Sé que hay una forma más elegante de hacerlo y estoy abierto a sugerencias ... esto es lo que hice:

try { // Set directory for list to be made of DirectoryInfo jpegInfo = new DirectoryInfo(destinationFolder); DirectoryInfo jpgInfo = new DirectoryInfo(destinationFolder); DirectoryInfo gifInfo = new DirectoryInfo(destinationFolder); DirectoryInfo tiffInfo = new DirectoryInfo(destinationFolder); DirectoryInfo bmpInfo = new DirectoryInfo(destinationFolder); // Set file type FileInfo[] Jpegs = jpegInfo.GetFiles("*.jpeg"); FileInfo[] Jpgs = jpegInfo.GetFiles("*.jpg"); FileInfo[] Gifs = gifInfo.GetFiles("*.gif"); FileInfo[] Tiffs = gifInfo.GetFiles("*.tiff"); FileInfo[] Bmps = gifInfo.GetFiles("*.bmp"); // listBox1.Items.Add(@""); // Hack for the first list item no preview problem // Iterate through each file, displaying only the name inside the listbox... foreach (FileInfo file in Jpegs) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); } foreach (FileInfo file in Jpgs) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); } foreach (FileInfo file in Gifs) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); } foreach (FileInfo file in Tiffs) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); } foreach (FileInfo file in Bmps) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); }