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