GetFiles avec plusieurs extensions [dupliquer]
possibilité de dupliquer:
vous pouvez appeler L'annuaire?GetFiles () avec plusieurs filtres?
comment filtrer sur plus d'une extension?
j'ai essayé:
FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp");
FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");
8 réponses
Pourquoi ne pas créer une méthode d'extension? C'est plus lisible.
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;
}
EDIT: une version plus efficace:
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));
}
Utilisation:
dInfo.GetFilesByExtensions(".jpg",".exe",".gif");
vous pouvez obtenir chaque fichier, puis filtrer le tableau:
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));
}
ce sera (marginalement) plus rapide que toutes les autres réponses ici.
Dans .Net 3.5, remplacer EnumerateFiles
par GetFiles
(qui est plus lent).
et l'utiliser comme ceci:
var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4");
vous ne pouvez pas faire cela, parce que GetFiles
n'accepte qu'un seul motif de recherche. Au lieu de cela, vous pouvez appeler GetFiles
sans motif, et filtrer les résultats dans le code:
string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };
FileInfo[] files =
dinfo.GetFiles()
.Where(f => extensions.Contains(f.Extension.ToLower()))
.ToArray();
si vous travaillez avec .NET 4, Vous pouvez utiliser la méthode EnumerateFiles
pour éviter de charger tous les objets FileInfo en mémoire en une seule fois:
string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };
FileInfo[] files =
dinfo.EnumerateFiles()
.Where(f => extensions.Contains(f.Extension.ToLower()))
.ToArray();
vous pouvez utiliser la méthode LINQ Union:
dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();
ce qui suit récupère les fichiers jpg, tiff et bmp et vous donne un IEnumerable<FileInfo>
sur lequel vous pouvez itérer:
var files = dinfo.GetFiles("*.jpg")
.Concat(dinfo.GetFiles("*.tiff"))
.Concat(dinfo.GetFiles("*.bmp"));
si vous avez vraiment besoin d'un tableau, collez simplement .ToArray()
à la fin de ceci.
je sais qu'il existe une façon plus élégante de le faire et je suis ouvert aux suggestions... c'est ce que j'ai fait:
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);
}
j'utilise la méthode suivante pour lister les fichiers.
'////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