Классы нового стиля - это подклассы «объект» (прямо или косвенно). Они имеют метод класса __new__
в дополнение к __init__
и имеют несколько более рациональное поведение на низком уровне.
Обычно вы хотите переопределить __getattr__
(если вы тоже переопределяете) , в противном случае вам будет сложно поддерживать синтаксис «self.foo» в ваших методах.
Дополнительная информация: http://www.devx.com/opensource/Article/31482/0 / Главная / 4
для
var exts = new[] { "mp3", "jpg" };
Вы могли бы:
public IEnumerable<string> FilterFiles(string path, params string[] exts) {
return
Directory
.EnumerateFiles(path, "*.*")
.Where(file => exts.Any(x => file.EndsWith(x, StringComparison.OrdinalIgnoreCase)));
}
Directory.EnumerateFiles
для повышения производительности ( Что это разница между Directory.EnumerateFiles vs Directory.GetFiles? ) .EndsWith("aspx", StringComparison.OrdinalIgnoreCase)
, а не .ToLower().EndsWith("aspx")
) Но реальная выгода EnumerateFiles
появляется, когда вы разделяете фильтры и объединяете результаты:
public IEnumerable<string> FilterFiles(string path, params string[] exts) {
return
exts.Select(x => "*." + x) // turn into globs
.SelectMany(x =>
Directory.EnumerateFiles(path, x)
);
}
Это становится немного быстрее, если вам не нужно их поворачивать
Оценка производительности на основе следующего теста LinqPad (примечание: Perf
просто повторяет делегат 10000 раз) https://gist.github.com / zaus / 7454021
(повторно отправлено и расширено от 'duplicate', поскольку этот вопрос специально запросил LINQ: Несколько расширений файлов searchPattern для System.IO.Directory.GetFiles )
Следующая функция выполняет поиск по нескольким шаблонам, разделенным запятыми. Вы также можете указать исключение, например: «! Web.config» будет искать все файлы и исключать «web.config». Шаблоны могут быть смешаны.
private string[] FindFiles(string directory, string filters, SearchOption searchOption)
{
if (!Directory.Exists(directory)) return new string[] { };
var include = (from filter in filters.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) where !string.IsNullOrEmpty(filter.Trim()) select filter.Trim());
var exclude = (from filter in include where filter.Contains(@"!") select filter);
include = include.Except(exclude);
if (include.Count() == 0) include = new string[] { "*" };
var rxfilters = from filter in exclude select string.Format("^{0}$", filter.Replace("!", "").Replace(".", @"\.").Replace("*", ".*").Replace("?", "."));
Regex regex = new Regex(string.Join("|", rxfilters.ToArray()));
List<Thread> workers = new List<Thread>();
List<string> files = new List<string>();
foreach (string filter in include)
{
Thread worker = new Thread(
new ThreadStart(
delegate
{
string[] allfiles = Directory.GetFiles(directory, filter, searchOption);
if (exclude.Count() > 0)
{
lock (files)
files.AddRange(allfiles.Where(p => !regex.Match(p).Success));
}
else
{
lock (files)
files.AddRange(allfiles);
}
}
));
workers.Add(worker);
worker.Start();
}
foreach (Thread worker in workers)
{
worker.Join();
}
return files.ToArray();
}
Использование:
foreach (string file in FindFiles(@"D:\628.2.11", @"!*.config, !*.js", SearchOption.AllDirectories))
{
Console.WriteLine(file);
}
List<string> FileList = new List<string>();
DirectoryInfo di = new DirectoryInfo("C:\\DirName");
IEnumerable<FileInfo> fileList = di.GetFiles("*.*");
//Create the query
IEnumerable<FileInfo> fileQuery = from file in fileList
where (file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png")
orderby file.LastWriteTime
select file;
foreach (System.IO.FileInfo fi in fileQuery)
{
fi.Attributes = FileAttributes.Normal;
FileList.Add(fi.FullName);
}
Path.GetExtension
возвращает '.ext', а не '* .ext' (по крайней мере, в 3.5+).
– nullable
4 January 2012 в 22:43
.abc
, а поддерживаемыйExtensions содержит .abcd
. Будет соответствовать, хотя это не должно. Исправить: supportedExtensions = ".jpg|.abcd|";
с .Contains(Path.GetExtension(s).ToLower() + "|")
. То есть, укажите свой разделительный символ в тесте. ВАЖНО: ваш разделительный символ также должен быть после записи LAST в поддерживаемыхExceptions.
– ToolmakerSteve
2 April 2018 в 13:10
Как насчет этого:
private static string[] GetFiles(string sourceFolder, string filters, System.IO.SearchOption searchOption)
{
return filters.Split('|').SelectMany(filter => System.IO.Directory.GetFiles(sourceFolder, filter, searchOption)).ToArray();
}
Я нашел его здесь (в комментариях): http://msdn.microsoft.com/en-us/library/wz42302f.aspx
Parallel.ForEach
, чтобы получить их параллельно
– FindOutIslamNow
21 June 2018 в 12:22
Существует также решение спуска, которое, как представляется, не имеет какой-либо памяти или производительности накладных расходов и довольно элегантно:
string[] filters = new[]{"*.jpg", "*.png", "*.gif"};
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();
Nop ... Я считаю, что вам нужно сделать столько звонков, сколько требуемых типов файлов.
Я бы создал функцию, которая сама взяла массив в строках с необходимыми расширениями и затем перебирала на этом массиве все необходимые вызовы. Эта функция вернет общий список файлов, соответствующих адресам, которые я отправил.
Надеюсь, что это поможет.
Если вы используете VB.NET (или импортировали зависимость в свой проект C #), на самом деле существует удобный метод, который позволяет фильтровать несколько расширений:
Microsoft.VisualBasic.FileIO.FileSystem.GetFiles("C:\\path", Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, new string[] {"*.mp3", "*.jpg"});
В VB.NET это могут быть доступны через My-namespace:
My.Computer.FileSystem.GetFiles("C:\path", FileIO.SearchOption.SearchAllSubDirectories, {"*.mp3", "*.jpg"})
К сожалению, эти удобные методы не поддерживают лениво оцененный вариант, например Directory.EnumerateFiles()
.
Я не знаю, какое решение лучше, но я использую это:
String[] ext = "*.ext1|*.ext2".Split('|');
List<String> files = new List<String>();
foreach (String tmp in ext)
{
files.AddRange(Directory.GetFiles(dir, tmp, SearchOption.AllDirectories));
}
Сделайте расширения, в которых вы хотите одну строку i.e «.mp3.jpg.wma.wmf», а затем проверьте, содержит ли каждый файл требуемое расширение. Это работает с .net 2.0, поскольку он не использует LINQ.
string myExtensions=".jpg.mp3";
string[] files=System.IO.Directory.GetFiles("C:\myfolder");
foreach(string file in files)
{
if(myExtensions.ToLower().contains(System.IO.Path.GetExtension(s).ToLower()))
{
//this file has passed, do something with this file
}
}
Преимущество этого подхода состоит в том, что вы можете добавлять или удалять расширения без редактирования кода, то есть добавлять png-изображения, просто напишите myExtensions = " .jpg.mp3.png».
надеюсь, что это кому-то поможет:
//getting only playable Audio/Video Files from open dialog
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = ""All Media Files|*.wav;*.aac;*.wma;*.wmv;*.avi;*.mpg;*.mpeg;*.m1v;*.mp2;*.mp3;*.mpa;*.mpe;*.m3u;*.mp4;*.mov;*.3g2;*.3gp2;*.3gp;*.3gpp;*.m4a;*.cda;*.aif;*.aifc;*.aiff;*.mid;*.midi;*.rmi;*.mkv;*.WAV;*.AAC;*.WMA;*.WMV;*.AVI;*.MPG;*.MPEG;*.M1V;*.MP2;*.MP3;*.MPA;*.MPE;*.M3U;*.MP4;*.MOV;*.3G2;*.3GP2;*.3GP;*.3GPP;*.M4A;*.CDA;*.AIF;*.AIFC;*.AIFF;*.MID;*.MIDI;*.RMI;*.MKV";
dlg.ShowDialog();
Я знаю, что это старый вопрос, но LINQ: (.NET40 +)
var files = Directory.GetFiles("path_to_files").Where(file => Regex.IsMatch(file, @"^.+\.(wav|mp3|txt)$"));
file.ToLower()
, чтобы легко соответствовать расширениям верхнего регистра. И почему бы не извлечь расширение сначала, поэтому Regex не должен проверять весь путь: Regex.IsMatch(Path.GetExtension(file).ToLower(), @"\.(wav|mp3|txt)");
– ToolmakerSteve
2 April 2018 в 13:17
Интересно, почему так много «решений» отправлено?
Если мое понимание новобранец о том, как работает GetFiles, прав, есть только два варианта, и любое из вышеперечисленных решений может быть сведено до эти:
На мой взгляд, вариант 1) лучше, но использование SearchOption.AllDirectories в таких папках, как C: \, будет использовать огромные объемы памяти. Поэтому я бы просто сделал рекурсивный под-метод, который проходит через все подпапки, используя опцию 1)
Это должно привести только к 1 GetFiles-операции в каждой папке и, следовательно, быть быстрым (вариант 1), но использовать только небольшой объем памяти, поскольку фильтры применяются после того, как каждая вложенная папка «чтение»> служебные данные удаляются после каждой подпапки.
Пожалуйста, исправьте меня, если я ошибаюсь. Я, как я сказал, совершенно новый для программирования, но хочу глубже понять вещи, чтобы в итоге стать хорошим:)
Просто нашел другой способ сделать это. Все еще не одна операция, а бросание ее, чтобы посмотреть, что другие люди думают об этом.
private void getFiles(string path)
{
foreach (string s in Array.FindAll(Directory.GetFiles(path, "*", SearchOption.AllDirectories), predicate_FileMatch))
{
Debug.Print(s);
}
}
private bool predicate_FileMatch(string fileName)
{
if (fileName.EndsWith(".mp3"))
return true;
if (fileName.EndsWith(".jpg"))
return true;
return false;
}
Нет. Попробуйте следующее:
List<string> _searchPatternList = new List<string>();
...
List<string> fileList = new List<string>();
foreach ( string ext in _searchPatternList )
{
foreach ( string subFile in Directory.GetFiles( folderName, ext )
{
fileList.Add( subFile );
}
}
// Sort alpabetically
fileList.Sort();
// Add files to the file browser control
foreach ( string fileName in fileList )
{
...;
}
Взято из: http://blogs.msdn.com/markda/archive/2006/04/20/580075.aspx
Или вы можете просто преобразовать строку расширений в String ^
vector <string> extensions = { "*.mp4", "*.avi", "*.flv" };
for (int i = 0; i < extensions.size(); ++i)
{
String^ ext = gcnew String(extensions[i].c_str());;
String^ path = "C:\\Users\\Eric\\Videos";
array<String^>^files = Directory::GetFiles(path,ext);
Console::WriteLine(ext);
cout << " " << (files->Length) << endl;
}
У меня была та же проблема и я не смог найти правильное решение, поэтому написал функцию GetFiles:
/// <summary>
/// Get all files with a specific extension
/// </summary>
/// <param name="extensionsToCompare">string list of all the extensions</param>
/// <param name="Location">string of the location</param>
/// <returns>array of all the files with the specific extensions</returns>
public string[] GetFiles(List<string> extensionsToCompare, string Location)
{
List<string> files = new List<string>();
foreach (string file in Directory.GetFiles(Location))
{
if (extensionsToCompare.Contains(file.Substring(file.IndexOf('.')+1).ToLower())) files.Add(file);
}
files.Sort();
return files.ToArray();
}
Эта функция будет вызывать Directory.Getfiles()
только один раз.
Например, вызовите функцию следующим образом:
string[] images = GetFiles(new List<string>{"jpg", "png", "gif"}, "imageFolder");
EDIT: для получения одного файла с несколькими расширениями используйте этот:
/// <summary>
/// Get the file with a specific name and extension
/// </summary>
/// <param name="filename">the name of the file to find</param>
/// <param name="extensionsToCompare">string list of all the extensions</param>
/// <param name="Location">string of the location</param>
/// <returns>file with the requested filename</returns>
public string GetFile( string filename, List<string> extensionsToCompare, string Location)
{
foreach (string file in Directory.GetFiles(Location))
{
if (extensionsToCompare.Contains(file.Substring(file.IndexOf('.') + 1).ToLower()) &&& file.Substring(Location.Length + 1, (file.IndexOf('.') - (Location.Length + 1))).ToLower() == filename)
return file;
}
return "";
}
Например, вызовите функцию, подобную этой :
string image = GetFile("imagename", new List<string>{"jpg", "png", "gif"}, "imageFolder");
в .NET 2.0 (нет Linq):
public static List<string> GetFilez(string path, System.IO.SearchOption opt, params string[] patterns)
{
List<string> filez = new List<string>();
foreach (string pattern in patterns)
{
filez.AddRange(
System.IO.Directory.GetFiles(path, pattern, opt)
);
}
// filez.Sort(); // Optional
return filez; // Optional: .ToArray()
}
Затем используйте его:
foreach (string fn in GetFilez(path
, System.IO.SearchOption.AllDirectories
, "*.xml", "*.xml.rels", "*.rels"))
{}
s.ToLower().Endswith...
– Stormenet 5 May 2010 в 10:35s.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase)
– Paul Farry 31 May 2010 в 23:58Directory.GetFiles
наDirectory.EnumerateFiles
, msdn.microsoft.com/en-us/library/dd383571.aspx , что позволит избежать проблем с памятью, которые @Christian .K упоминает. – Jim Mischel 3 December 2011 в 00:58.FilterFiles(path, "jpg", "gif")
) лучше, чем «явные глобусы». (т. е..FilterFiles(path, "*.jpg", "*.gif")
). – drzaus 23 July 2014 в 16:42