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


354

Я пытаюсь использовать Directory.GetFiles()метод для получения списка файлов нескольких типов, таких как mp3's и jpg'. Я попробовал оба из следующих без удачи:

Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories);
Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);

Есть ли способ сделать это за один звонок?


3
Как примечание: использование шаблона поиска GetFiles для фильтрации расширения небезопасно. Например, у вас есть два файла Test1.xls и Test2.xlsx, и вы хотите отфильтровать файл xls с помощью шаблона поиска * .xls, но GetFiles возвращает оба Test1. .xls и Test2.xlsx. Прочитайте раздел «Примечание» для получения дополнительной информации
Киран

Так как это предотвратить?
Скобки

2
@kiran Как это не безопасно? Это похоже на функцию, а не ошибка.
Кайл Делани

Ответы:


521

Для .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"));

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


10
Чувак, я должен чаще мыслить в терминах LINQ. Отличное решение!
Кен Песиза

61
Просто убедитесь, что вы понимаете последствия: это вернет все файлы в строковом массиве, а затем отфильтрует его по указанным вами расширениям. Это может не быть большой проблемой, если «C: \ Path» не имеет много файлов под ним, но может быть проблема с памятью / производительностью на «C: \» или что-то в этом роде.
Christian.K

24
... 2 года спустя: хороший код, но будьте осторожны с этим, если у вас есть файл, который заканчивается на .JPG, он этого не сделает. Лучше добавитьs.ToLower().Endswith...
Stormenet

107
Вы могли бы просто использоватьs.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase)
Пол Фарри

119
Обратите внимание , что с .NET 4.0, вы можете заменить Directory.GetFilesс Directory.EnumerateFiles, msdn.microsoft.com/en-us/library/dd383571.aspx , что позволит избежать проблем с памятью , которые @ Christian.K упоминает.
Джим Мишель

60

Как насчет этого:

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


Я предполагаю, что это позволяет избежать потенциальных ошибок памяти в ответе с самым высоким рейтингом? В этом случае это должно быть оценено выше!
Дан W

11
@DanW Ответ с самым высоким рейтингом, безусловно, обременяет память, но я думаю, что это не должно быть такой проблемой. Мне тоже понравился этот ответ, но на самом деле он (намного) медленнее, чем принятый ответ. Проверьте это SpeedTest
OttO

Спасибо. Рад видеть, что это всего лишь в два раза медленнее - я буду придерживаться этого пока, я думаю.
Дан W

7
Это только вдвое медленнее, если есть только два расширения. Если у вас есть список X-расширений, то он будет в X раз медленнее. Потому что здесь вы вызываете функцию Directory.GetFiles несколько раз, тогда как в другом решении она вызывается только один раз.
Оскар Эрмосилья

1
@OscarHermosilla Можно использовать, Parallel.ForEachчтобы получить их параллельно
FindOutIslamNow

33

Если у вас есть большой список расширений для проверки, вы можете использовать следующее. Я не хотел создавать много операторов OR, поэтому я изменил то, что написал lette.

string supportedExtensions = "*.jpg,*.gif,*.png,*.bmp,*.jpe,*.jpeg,*.wmf,*.emf,*.xbm,*.ico,*.eps,*.tif,*.tiff,*.g01,*.g02,*.g03,*.g04,*.g05,*.g06,*.g07,*.g08";
foreach (string imageFile in Directory.GetFiles(_tempDirectory, "*.*", SearchOption.AllDirectories).Where(s => supportedExtensions.Contains(Path.GetExtension(s).ToLower())))
{
    //do work here
}

Помогите мне с этим, пожалуйста ... Когда я печатаю файл imageFile, он дает полный путь к нему. Как я могу уменьшить его до только имени файла.
Нареш

1
System.IO.Path.GetFileName (imageFile)
jnoreiga

Path.GetExtensionвозвращает «.ext», а не «* .ext» (по крайней мере, в 3.5+).
обнуляется

2
К вашему сведению: вам нужен System.Linq для .where (
jnoreiga

1
Существует потенциальный недостаток. Мы давно прошли те дни, когда для расширений требовалось ровно три символа. Предположим, что вы можете столкнуться с файлом .abc, который поддерживается .abcd. Будет соответствовать, хотя это не должно. Чтобы исправить: supportedExtensions = ".jpg|.abcd|";с .Contains(Path.GetExtension(s).ToLower() + "|"). То есть включите ваш символ-разделитель в тест. ВАЖНО: ваш символ-разделитель также должен быть после последней записи в SupportExceptions.
ToolmakerSteve

31

за

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)));
}

Но реальная выгода EnumerateFilesпроявляется, когда вы разделяете фильтры и объединяете результаты:

public IEnumerable<string> FilterFiles(string path, params string[] exts) {
    return 
        exts.Select(x => "*." + x) // turn into globs
        .SelectMany(x => 
            Directory.EnumerateFiles(path, x)
            );
}

Это становится немного быстрее, если вам не нужно превращать их в шарики (то есть exts = new[] {"*.mp3", "*.jpg"}уже).

Оценка производительности на основе следующего теста LinqPad (примечание: Perfпросто повторяет делегата 10000 раз) https://gist.github.com/zaus/7454021

(перепечатано и расширено от «дубликата», поскольку этот вопрос специально не запрашивал LINQ: множественные расширения файлов searchPattern для System.IO.Directory.GetFiles )


что вы подразумеваете под "я становлюсь немного быстрее, если вам не нужно превращать их в шарики"? Это O (1) или O (n) (в отношении количества файлов, а не количества расширений)? Я бы догадался, что это O (1) (или O (n) в отношении количества расширений) и, вероятно, где-то в диапазоне нескольких циклов ЦП ... Если это так, то, вероятно, - по производительности - незначительно
BatteryBackupUnit

@BatteryBackupUnit да, с 10 тыс. Повторений против 2-х расширений разница в глобусе и str составляет 3 мс, так что да, технически ничтожно (см. Ссылку на результаты perf), но не зная, сколько расширений вам нужно отфильтровать, я решил, что стоит указать, что есть разница; я оставляю на ваше .FilterFiles(path, "jpg", "gif")усмотрение решение, является ли «упрощенное использование» (т.е. ) лучше, чем «явные глобусы» (т.е. .FilterFiles(path, "*.jpg", "*.gif")).
drzaus

отлично, спасибо. Извините, я как-то пропустил эту ссылку на github. Может быть, я должен адаптировать свои настройки цвета экрана :)
BatteryBackupUnit

Поддерживает ли расширение в верхнем регистре такие задницы .JPG или .MKV?
Вахью

1
Недостаток решения SelectMany заключается в том, что оно будет перебирать все файлы один раз для каждого переданного расширения файла.
17 из 26

16

Я знаю, что это старый вопрос, но LINQ: (.NET40 +)

var files = Directory.GetFiles("path_to_files").Where(file => Regex.IsMatch(file, @"^.+\.(wav|mp3|txt)$"));

3
Хорошая идея. Подумайте об использовании, file.ToLower()чтобы легко сопоставлять расширения в верхнем регистре. И почему бы сначала не извлечь расширение, чтобы Regex не приходилось проверять весь путь: Regex.IsMatch(Path.GetExtension(file).ToLower(), @"\.(wav|mp3|txt)");
ToolmakerSteve

13

Существует также решение для спуска, которое, похоже, не имеет никаких затрат памяти или производительности и выглядит довольно элегантно:

string[] filters = new[]{"*.jpg", "*.png", "*.gif"};
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();

1
Я полагаю, что мог бы отредактировать его так, чтобы он принимал неизвестное неограниченное количество расширений с новой строковой переменной и функцией Split. Но даже тогда, как это лучше, чем решение jnoreiga? Это быстрее? Меньше памяти?
Кронштейны

1
Здесь есть компромисс. Этот подход вызывает GetFiles несколько раз, по одному на фильтр. Эти множественные вызовы могут быть значительными «потерями производительности» в некоторых ситуациях. Это имеет важное преимущество в том, что каждый GetFiles возвращает только массив с соответствующими путями к файлам. Я ожидаю, что это обычно будет хороший результат производительности, может быть, даже превосходной производительности, но это нужно проверить. Если GetFiles значительно быстрее, чем EnumerateFiles, тогда это может быть лучшим подходом. Также обратите внимание, что последний ".ToArray ()" может быть опущен, когда IEnumerable может использоваться напрямую.
ToolmakerSteve

11

Другой способ использовать Linq, но без необходимости возвращать все и фильтровать это в памяти.

var files = Directory.GetFiles("C:\\path", "*.mp3", SearchOption.AllDirectories).Union(Directory.GetFiles("C:\\path", "*.jpg", SearchOption.AllDirectories));

На самом деле это 2 звонка GetFiles(), но я думаю, что это соответствует духу вопроса и возвращает их в одном перечислении.


Зачем тогда использовать Linq? Будет ли это быстрее, чем использование List и addrange?
ThunderGr

1
Я не знаю, что будет быстрее, и не думаю, что это важный вопрос. почти в любом месте, где вы будете использовать код для любого решения этой проблемы, разница в производительности будет незначительной. вопрос должен заключаться в том, что будет более читабельным, чтобы облегчить поддержку кода в будущем. Я думаю, что это разумный ответ, потому что он помещает в одну строку исходного текста, которая, я думаю, является частью того, чего хочет этот вопрос, необходимых вызовов и четко выражает намерение этой строки. list и addrange отвлекают множеством шагов, чтобы выполнить одно и то же.
Дэйв Раэль

7

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

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

Позволять

var set = new HashSet<string> { ".mp3", ".jpg" };

затем

Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
         .Where(f => set.Contains(
             new FileInfo(f).Extension,
             StringComparer.OrdinalIgnoreCase));

или

from file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
from ext in set
where String.Equals(ext, new FileInfo(file).Extension, StringComparison.OrdinalIgnoreCase)
select file;

В getfiles нет перегрузки, опубликованной вами.
nawfal

5

Я не могу использовать .Whereметод, потому что я программирую на .NET Framework 2.0 (Linq поддерживается только в .NET Framework 3.5+).

Код ниже не чувствителен к регистру (так будет .CaBили .cabбудет указан тоже).

string[] ext = new string[2] { "*.CAB", "*.MSU" };

foreach (string found in ext)
{
    string[] extracted = Directory.GetFiles("C:\\test", found, System.IO.SearchOption.AllDirectories);

    foreach (string file in extracted)
    {
        Console.WriteLine(file);
    }
}

4

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

4
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);
}

file.Extension.ToLower()это плохая практика.
абатищев

тогда что мы должны использовать? @abatishchev
Nitin Sawant

@Nitin:String.Equals(a, b, StringComparison.OrdinalIgnoreCase)
Абатищев

1
На самом деле, file.Extension.Equals (".jpg", StringComparison.OrdinalIgnoreCase) - это то, что я предпочитаю. Кажется, это быстрее, чем .ToLower или .ToUpper, или так говорят везде, где я искал. На самом деле .Equals также быстрее, чем ==, так как == вызывает .Equals и проверяет на null (потому что вы не можете делать null.Equals (null)).
ThunderGr

4

в .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"))
{}

4
DirectoryInfo directory = new DirectoryInfo(Server.MapPath("~/Contents/"));

//Using Union

FileInfo[] files = directory.GetFiles("*.xlsx")
                            .Union(directory
                            .GetFiles("*.csv"))
                            .ToArray();

3

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

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

Что о

string[] filesPNG = Directory.GetFiles(path, "*.png");
string[] filesJPG = Directory.GetFiles(path, "*.jpg");
string[] filesJPEG = Directory.GetFiles(path, "*.jpeg");

int totalArraySizeAll = filesPNG.Length + filesJPG.Length + filesJPEG.Length;
List<string> filesAll = new List<string>(totalArraySizeAll);
filesAll.AddRange(filesPNG);
filesAll.AddRange(filesJPG);
filesAll.AddRange(filesJPEG);

2

Сделайте для расширений нужную вам строку, например «.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".


это не знает, что этоs
Скобки

2
/// <summary>
/// Returns the names of files in a specified directories that match the specified patterns using LINQ
/// </summary>
/// <param name="srcDirs">The directories to seach</param>
/// <param name="searchPatterns">the list of search patterns</param>
/// <param name="searchOption"></param>
/// <returns>The list of files that match the specified pattern</returns>
public static string[] GetFilesUsingLINQ(string[] srcDirs,
     string[] searchPatterns,
     SearchOption searchOption = SearchOption.AllDirectories)
{
    var r = from dir in srcDirs
            from searchPattern in searchPatterns
            from f in Directory.GetFiles(dir, searchPattern, searchOption)
            select f;

    return r.ToArray();
}

2

Нет ... Я считаю, что вам нужно сделать столько звонков, сколько вам нужно.

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

Надеюсь, поможет.


1

У меня была та же проблема, и я не мог найти правильное решение, поэтому я написал функцию под названием 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");

РЕДАКТИРОВАТЬ: Чтобы получить один файл с несколькими расширениями, используйте этот:

/// <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");

1

Интересно, почему опубликовано так много «решений»?

Если мое понимание новичка о том, как работает GetFiles, верно, есть только два варианта, и любое из приведенных выше решений может быть сведено к следующему:

  1. GetFiles, затем фильтр: быстро, но убийца памяти из-за хранения служебных данных до применения фильтров

  2. Фильтровать при GetFiles: чем медленнее, тем больше фильтров установлено, но низкое потребление памяти, так как никакие накладные расходы не сохраняются.
    Это объясняется в одном из приведенных выше постов с впечатляющим тестом: каждый параметр фильтра вызывает отдельную операцию GetFile, поэтому одна и та же часть жесткого диска читается несколько раз.

На мой взгляд, вариант 1) лучше, но использование SearchOption.AllDirectories для таких папок, как C: \, потребовало бы огромных объемов памяти.
Поэтому я бы просто сделал рекурсивный под-метод, который просматривает все подпапки, используя опцию 1)

Это должно вызывать только 1 операцию GetFiles для каждой папки и, следовательно, быть быстрым (вариант 1), но использовать только небольшой объем памяти, так как фильтры применяются после чтения каждой подпапки -> служебная информация удаляется после каждой подпапки.

Пожалуйста, поправьте меня, если я ошибаюсь. Я, как я уже сказал, довольно новичок в программировании, но хочу получить более глубокое понимание вещей, чтобы в конечном итоге стать хорошим в этом :)


1

Если вы используете VB.NET (или импортировали зависимость в ваш проект C #), на самом деле существует удобный метод, который позволяет фильтровать по нескольким расширениям:

Microsoft.VisualBasic.FileIO.FileSystem.GetFiles("C:\\path", Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, new string[] {"*.mp3", "*.jpg"});

В VB.NET это может быть доступно через пространство имен My:

My.Computer.FileSystem.GetFiles("C:\path", FileIO.SearchOption.SearchAllSubDirectories, {"*.mp3", "*.jpg"})

К сожалению, эти удобные методы не поддерживают лениво оцененный вариант, как это Directory.EnumerateFiles()делает.


Это, пожалуй, лучший ответ, и все же, что-то гораздо более хакерское, является общепринятым. Должен любить ТАК.
Робби Койн

0

я не знаю, какое решение лучше, но я использую это:

String[] ext = "*.ext1|*.ext2".Split('|');

            List<String> files = new List<String>();
            foreach (String tmp in ext)
            {
                files.AddRange(Directory.GetFiles(dir, tmp, SearchOption.AllDirectories));
            }

0

Вот простой и элегантный способ получения отфильтрованных файлов

var allowedFileExtensions = ".csv,.txt";


var files = Directory.EnumerateFiles(@"C:\MyFolder", "*.*", SearchOption.TopDirectoryOnly)
                .Where(s => allowedFileExtensions.IndexOf(Path.GetExtension(s)) > -1).ToArray(); 

-1

Или вы можете просто преобразовать строку расширений в строку ^

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;
}

2
Это c ++, а не c #
скобки

-1

Использование шаблона поиска GetFiles для фильтрации расширения небезопасно !! Например, у вас есть два файла Test1.xls и Test2.xlsx, и вы хотите отфильтровать файл xls, используя шаблон поиска * .xls, но GetFiles возвращает оба Test1.xls и Test2.xlsx. Я не знал об этом и получил ошибку в работе среда, когда некоторые временные файлы внезапно обрабатывались как правильные файлы. Шаблон поиска был * .txt, а временные файлы были названы * .txt20181028_100753898. Таким образом, шаблон поиска нельзя доверять, необходимо также добавить дополнительную проверку имен файлов.


Не отвечает на вопрос.
Робби Койн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.