Чи можете ви викликати Directory.GetFiles () з кількома фільтрами?


353

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

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. Прочитайте розділ Примітка для отримання додаткової інформації
kiran

То як запобігти цьому?
Дужки

2
@kiran Як це не безпечно? Це схоже на функцію, а не на помилку.
Кайл Делані

Відповіді:


519

Для .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: \" чи щось подібне.
Крістіан.К

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


Я здогадуюсь, що це дозволяє уникнути можливих підводних каменів пам’яті найкращого відповіді? У такому випадку його слід оцінювати вище!
Dan W

11
@DanW Топ-відповідь, безумовно, накладає тягар на пам'ять, але я думаю, це не повинно бути такою проблемою. Мені сподобалась і ця відповідь, але насправді (набагато) повільніше, ніж прийнята відповідь. Перевірте цей SpeedTest
OttO

Дякую. Радий бачити, що це приблизно вдвічі повільніше - я дотримуюся цього часу, я думаю.
Dan W

7
Це лише вдвічі повільніше, якщо є лише два розширення. Якщо у вас є список розширень X, то це буде в X рази повільніше. Тому що тут ви викликаєте функцію Directory.GetFiles кілька разів, тоді як в іншому рішенні вона викликається лише один раз.
Оскар Ермосіла

1
@OscarHermosilla Можна використовувати Parallel.ForEachпаралельно їх
FindOutIslamNow

33

Якщо у вас є великий список розширень для перевірки, ви можете скористатися наступним. Я не хотів створювати багато операцій АБО, тому я змінив те, що писав 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
FYI: Вам потрібен System.Linq для .where (
jnoreiga

1
Є потенційний недолік. Ми давно минули дні, коли розширення повинні містити рівно три символи. Припустимо, ви можете зіткнутися з файлом .abc, який містить і підтримувані розширення .abcd. Буде відповідати, хоча це не повинно. Виправити: supportedExtensions = ".jpg|.abcd|";с .Contains(Path.GetExtension(s).ToLower() + "|"). Тобто, включіть у тест свій розділовий символ. ВАЖЛИВО: ваш розділовий символ також повинен бути після ОСТАНОГО запису в підтримуваних винятках.
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: Multiple файлів розширень searchPattern для System.IO.Directory.GetFiles )


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

@BatteryBackupUnit так, з 10-ти повторами проти 2-х розширень, різниця в глобулі проти str - 3 мс, тому так технічно мізерно (див. Посилання на результати перф), але не знаючи, скільки розширень потрібно відфільтрувати, я зрозумів, що варто зазначити, що є різниця; Я залишаю за вами вирішити, чи "спрощене використання" (тобто .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? Це було б швидше, ніж використання списку та додати?
ThunderGr

1
я не знаю, що було б швидше і не думаю, що це важливе питання. майже для будь-якого місця, де ви використовували б код для вирішення цієї проблеми, різниця в продуктивності була б незначною. Питання повинно бути в тому, що можна читати, щоб полегшити ремонтопридатність коду в майбутньому. Я думаю, що це розумна відповідь, оскільки вона вкладає в один вихідний рядок, який, на мою думку, є частиною того, що запитання бажає, необхідні дзвінки і чітко виражає наміри цього рядка. список і добавка відволікає кілька кроків, щоб виконати те саме.
Дейв Реель

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 не розміщують перевантаження u.
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", StringComppare.OrdinalIgnoreCase) - те, що я віддаю перевагу. Здається, це швидше, ніж .ToLower або .ToUpper, або так вони кажуть, де я шукав. Насправді .Equals швидше, ніж ==, оскільки == викликає .Equals і перевіряє null (Тому що ви не можете робити null.Equals (null)).
Грім

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

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

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-namespace:

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

Або ви можете просто перетворити рядок розширень у 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;
}

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.