Можно ли назвать Каталог. GetFiles () с несколькими фильтрами?

Также может быть #include <windows.h> в .c файле, который вы пытаетесь скомпилировать.

338
задан lahsrah 14 January 2013 в 15:45
поделиться

5 ответов

Для.NET 4.0 и позже,

var files = Directory.EnumerateFiles("C:\\path", "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));

Для более ранних версий.NET,

var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));

редактирование: прочитайте комментарии. Улучшение, что Paul Farry предлагает, и проблема памяти/производительности тот христианин. K указывает, оба очень важны.

493
ответ дан Community 23 November 2019 в 00:39
поделиться

Только для указанных целей... Я полагаю, что необходимо выполнить столько же вызовов сколько типы файлов, которые Вы хотите.

я создал бы функцию, сам берущую массив на строках с расширениями, в которых я нуждаюсь и затем выполняю итерации на том массиве, выполняющем все необходимые вызовы. Та функция возвратила бы универсальный список файлов, соответствующих расширениям, которые я отправил.

Hope это помогает.

2
ответ дан bluish 23 November 2019 в 00:39
поделиться

Нет. Попробуйте следующее:

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

7
ответ дан NotMe 23 November 2019 в 00:39
поделиться

Просто найденный другим способом сделать это. Все еще одна операция, но вывод его для наблюдения то, что другие люди думают об этом.

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;
}
3
ответ дан Jason Z 23 November 2019 в 00:39
поделиться

Следующая функция выполняет поиск по нескольким шаблонам, разделенным запятыми. Вы также можете указать исключение, например: "!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();

}

Usage:

foreach (string file in FindFiles(@"D:\628.2.11", @"!*.config, !*.js", SearchOption.AllDirectories))
            {
                Console.WriteLine(file);
            }
4
ответ дан 23 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: