From ce92e79cd836f45ae5489a265287de85a3c187d3 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 21 Jan 2026 10:28:16 -0700 Subject: [PATCH] Fix SaferEnumerateFiles creating too manu open file handles (#1565) Using the EnumerationOptions overload of EnumerateFiles() serves the same function as the previous manual implementation. --- Source/FileManager/FileUtility.cs | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/Source/FileManager/FileUtility.cs b/Source/FileManager/FileUtility.cs index 484ed1a8..b2bc4274 100644 --- a/Source/FileManager/FileUtility.cs +++ b/Source/FileManager/FileUtility.cs @@ -244,27 +244,14 @@ namespace FileManager /// List of files public static IEnumerable SaferEnumerateFiles(LongPath path, string searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly) { - var foundFiles = Enumerable.Empty(); - - try - { - if (searchOption == SearchOption.AllDirectories) - { - IEnumerable subDirs = Directory.EnumerateDirectories(path).Select(p => (LongPath)p); - // Add files in subdirectories recursively to the list - foreach (string dir in subDirs) - foundFiles = foundFiles.Concat(SaferEnumerateFiles(dir, searchPattern, searchOption)); - } - - // Add files from the current directory - foundFiles = foundFiles.Concat(Directory.EnumerateFiles(path, searchPattern).Select(f => (LongPath)f)); - } - catch (UnauthorizedAccessException) { } - catch (PathTooLongException) { } - // Symbolic links will result in DirectoryNotFoundException. Ohter logical directories might also. Just skip them. Don't want to risk (or have to handle) infinite recursion - catch (DirectoryNotFoundException) { } - - return foundFiles; + var enumOptions = new EnumerationOptions + { + RecurseSubdirectories = searchOption == SearchOption.AllDirectories, + IgnoreInaccessible = true, + ReturnSpecialDirectories = false, + MatchType = MatchType.Simple + }; + return Directory.EnumerateFiles(path.Path, searchPattern, enumOptions).Select(p => (LongPath) p); } ///