diff --git a/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs b/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs index 7210e801152d..5c01476bfc5e 100644 --- a/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs +++ b/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs @@ -3,6 +3,7 @@ using System.Collections.Concurrent; using System.IO; +using System.Runtime.InteropServices; using Windows.Win32; using Windows.Win32.Storage.FileSystem; @@ -29,12 +30,12 @@ await Parallel.ForEachAsync( _paths, cancellationToken, async (path, token) => await Task.Factory.StartNew(() => - { - ComputeSizeRecursively(path, token); - }, - token, - TaskCreationOptions.LongRunning, - TaskScheduler.Default)); + { + ComputeSizeRecursively(path, token); + }, + token, + TaskCreationOptions.LongRunning, + TaskScheduler.Default)); unsafe void ComputeSizeRecursively(string path, CancellationToken token) { @@ -73,24 +74,30 @@ unsafe void ComputeSizeRecursively(string path, CancellationToken token) var itemPath = Path.Combine(directory, findData.cFileName.ToString()); - if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_DIRECTORY)) + // Skip current and parent directory entries + var fileName = findData.cFileName.ToString(); + if (fileName.Equals(".", StringComparison.OrdinalIgnoreCase) || + fileName.Equals("..", StringComparison.OrdinalIgnoreCase)) { - ComputeFileSize(itemPath); + continue; } - else if (findData.cFileName.ToString() is string fileName && - fileName.Equals(".", StringComparison.OrdinalIgnoreCase) && - fileName.Equals("..", StringComparison.OrdinalIgnoreCase)) + + if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_DIRECTORY)) { queue.Enqueue(itemPath); } + else + { + ComputeFileSize(itemPath); + } if (token.IsCancellationRequested) break; } while (PInvoke.FindNextFile(hFile, &findData)); - } - PInvoke.CloseHandle(hFile); + PInvoke.FindClose(hFile); + } } } }