Заражен с несколькими расширениями [дубликат]
Возможные Дубликаты:
вы можете позвонить в каталог.GetFiles () с несколькими фильтрами?
Как вы фильтруете на более чем одном расширении?
Я пробовал:
FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp");
FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");
8 ответов:
почему бы не создать метод расширения? Это более читабельно.
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");
вы можете получить каждый файл, а затем отфильтровать массив:
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
(который медленнее).и использовать его так:
var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4");
вы не можете этого сделать, потому что
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();
вы можете использовать метод Linq Union:
dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();
следующее извлекает файлы jpg, tiff и bmp и дает вам
IEnumerable<FileInfo>
над которым вы можете повторить:var files = dinfo.GetFiles("*.jpg") .Concat(dinfo.GetFiles("*.tiff")) .Concat(dinfo.GetFiles("*.bmp"));
Если вам действительно нужен массив, просто палкой
.ToArray()
в конце этого.
Я не уверен, что это возможно. В заражен-узел MSDN ссылка говорит шаблон поиска, а не список моделей поиск.
Я мог бы быть склонен извлекать каждый список отдельно и" foreach " их в окончательный список.
Я знаю, что есть более элегантный способ сделать это, и я открыт для предложений... вот что я сделал:
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); }
Я использую следующий способ получить список файлов.
'////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