GetFiles с несколькими расширениями
Возможный дубликат:
Можно ли вызвать Directory.GetFiles() с несколькими фильтрами?
Как вы фильтруете более одного расширения?
Я пробовал:
FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp");
FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");
Ответы
Ответ 1
Почему бы не создать метод расширения? Это более читаемо.
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: более эффективная версия:
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));
}
Использование:
dInfo.GetFilesByExtensions(".jpg",".exe",".gif");
Ответ 2
Вы можете получить каждый файл, а затем фильтровать массив:
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));
}
Это будет (незначительно) быстрее, чем любой другой ответ здесь.
В .Net 3.5 замените EnumerateFiles
на GetFiles
(что медленнее).
Ответ 3
Вы не можете этого сделать, потому что GetFiles
принимает только один шаблон поиска. Вместо этого вы можете вызывать GetFiles
без шаблона и фильтровать результаты в коде:
string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };
FileInfo[] files =
dinfo.GetFiles()
.Where(f => extensions.Contains(f.Extension.ToLower()))
.ToArray();
Если вы работаете с .NET 4, вы можете использовать метод EnumerateFiles
, чтобы не загружать сразу все объекты FileInfo:
string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };
FileInfo[] files =
dinfo.EnumerateFiles()
.Where(f => extensions.Contains(f.Extension.ToLower()))
.ToArray();
Ответ 4
Вы можете использовать метод LINQ Union:
dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();
Ответ 5
Ниже вы получаете файлы jpg, tiff и bmp и вы получаете IEnumerable<FileInfo>
, по которому вы можете выполнять итерацию:
var files = dinfo.GetFiles("*.jpg")
.Concat(dinfo.GetFiles("*.tiff"))
.Concat(dinfo.GetFiles("*.bmp"));
Если вам действительно нужен массив, просто вставьте .ToArray()
в конце этого.
Ответ 6
Я не уверен, что это возможно. MSDN GetFiles ссылка говорит шаблон поиска, а не список шаблонов поиска.
Я мог бы склониться к выбору каждого списка отдельно и "занести" их в окончательный список.
Ответ 7
Я знаю, что есть более элегантный способ сделать это, и я открыт для предложений... это то, что я сделал:
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);
}
Ответ 8
Я использую следующий способ списка файлов.
'////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