From e24a7d2b65a50e1feed2a530642e8740469cef8f Mon Sep 17 00:00:00 2001 From: primetime43 <12754111+primetime43@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:51:08 -0500 Subject: [PATCH 1/3] Fixes #16538 Fixes #16538 by using FindClose instead of CloseHandle --- .../Storage/Operations/FileSizeCalculator.cs | 63 ++++++++++++------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs b/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs index 7210e801152d..dae3576aba83 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,9 +30,9 @@ await Parallel.ForEachAsync( _paths, cancellationToken, async (path, token) => await Task.Factory.StartNew(() => - { - ComputeSizeRecursively(path, token); - }, + { + ComputeSizeRecursively(path, token); + }, token, TaskCreationOptions.LongRunning, TaskScheduler.Default)); @@ -63,34 +64,48 @@ unsafe void ComputeSizeRecursively(string path, CancellationToken token) if (!hFile.IsNull) { - do + try { - FILE_FLAGS_AND_ATTRIBUTES attributes = (FILE_FLAGS_AND_ATTRIBUTES)findData.dwFileAttributes; - - if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_REPARSE_POINT)) - // Skip symbolic links and junctions - continue; - - var itemPath = Path.Combine(directory, findData.cFileName.ToString()); - - if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_DIRECTORY)) + do { - ComputeFileSize(itemPath); + FILE_FLAGS_AND_ATTRIBUTES attributes = (FILE_FLAGS_AND_ATTRIBUTES)findData.dwFileAttributes; + + if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_REPARSE_POINT)) + // Skip symbolic links and junctions + continue; + + var itemPath = Path.Combine(directory, findData.cFileName.ToString()); + + // Skip current and parent directory entries + var fileName = findData.cFileName.ToString(); + if (fileName.Equals(".", StringComparison.OrdinalIgnoreCase) || + fileName.Equals("..", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_DIRECTORY)) + { + queue.Enqueue(itemPath); + } + else + { + ComputeFileSize(itemPath); + } + + if (token.IsCancellationRequested) + break; } - else if (findData.cFileName.ToString() is string fileName && - fileName.Equals(".", StringComparison.OrdinalIgnoreCase) && - fileName.Equals("..", StringComparison.OrdinalIgnoreCase)) + while (PInvoke.FindNextFile(hFile, &findData)); + } + finally + { + if (!PInvoke.FindClose(hFile)) { - queue.Enqueue(itemPath); + var error = Marshal.GetLastWin32Error(); } - - if (token.IsCancellationRequested) - break; } - while (PInvoke.FindNextFile(hFile, &findData)); } - - PInvoke.CloseHandle(hFile); } } } From f2a4e2b866b9291fd75280189a901372bd565fdb Mon Sep 17 00:00:00 2001 From: primetime43 <12754111+primetime43@users.noreply.github.com> Date: Thu, 20 Feb 2025 11:18:27 -0500 Subject: [PATCH 2/3] Removed the try, finally, & error variable - Removed the try, finally, & error variable #16830 --- .../Storage/Operations/FileSizeCalculator.cs | 68 ++++++++----------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs b/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs index dae3576aba83..5c01476bfc5e 100644 --- a/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs +++ b/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs @@ -33,9 +33,9 @@ await Parallel.ForEachAsync( { ComputeSizeRecursively(path, token); }, - token, - TaskCreationOptions.LongRunning, - TaskScheduler.Default)); + token, + TaskCreationOptions.LongRunning, + TaskScheduler.Default)); unsafe void ComputeSizeRecursively(string path, CancellationToken token) { @@ -64,47 +64,39 @@ unsafe void ComputeSizeRecursively(string path, CancellationToken token) if (!hFile.IsNull) { - try + do { - do + FILE_FLAGS_AND_ATTRIBUTES attributes = (FILE_FLAGS_AND_ATTRIBUTES)findData.dwFileAttributes; + + if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_REPARSE_POINT)) + // Skip symbolic links and junctions + continue; + + var itemPath = Path.Combine(directory, findData.cFileName.ToString()); + + // Skip current and parent directory entries + var fileName = findData.cFileName.ToString(); + if (fileName.Equals(".", StringComparison.OrdinalIgnoreCase) || + fileName.Equals("..", StringComparison.OrdinalIgnoreCase)) { - FILE_FLAGS_AND_ATTRIBUTES attributes = (FILE_FLAGS_AND_ATTRIBUTES)findData.dwFileAttributes; - - if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_REPARSE_POINT)) - // Skip symbolic links and junctions - continue; - - var itemPath = Path.Combine(directory, findData.cFileName.ToString()); - - // Skip current and parent directory entries - var fileName = findData.cFileName.ToString(); - if (fileName.Equals(".", StringComparison.OrdinalIgnoreCase) || - fileName.Equals("..", StringComparison.OrdinalIgnoreCase)) - { - continue; - } - - if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_DIRECTORY)) - { - queue.Enqueue(itemPath); - } - else - { - ComputeFileSize(itemPath); - } - - if (token.IsCancellationRequested) - break; + continue; } - while (PInvoke.FindNextFile(hFile, &findData)); - } - finally - { - if (!PInvoke.FindClose(hFile)) + + if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_DIRECTORY)) + { + queue.Enqueue(itemPath); + } + else { - var error = Marshal.GetLastWin32Error(); + ComputeFileSize(itemPath); } + + if (token.IsCancellationRequested) + break; } + while (PInvoke.FindNextFile(hFile, &findData)); + + PInvoke.FindClose(hFile); } } } From 4dc80cbdf2f505f143f8a993c19d24c53e2d08ce Mon Sep 17 00:00:00 2001 From: primetime43 <12754111+primetime43@users.noreply.github.com> Date: Thu, 20 Feb 2025 11:18:27 -0500 Subject: [PATCH 3/3] Removed the try, finally, & error variable #16538 - Removed the try, finally, & error variable #16538 --- .../Storage/Operations/FileSizeCalculator.cs | 68 ++++++++----------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs b/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs index dae3576aba83..5c01476bfc5e 100644 --- a/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs +++ b/src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs @@ -33,9 +33,9 @@ await Parallel.ForEachAsync( { ComputeSizeRecursively(path, token); }, - token, - TaskCreationOptions.LongRunning, - TaskScheduler.Default)); + token, + TaskCreationOptions.LongRunning, + TaskScheduler.Default)); unsafe void ComputeSizeRecursively(string path, CancellationToken token) { @@ -64,47 +64,39 @@ unsafe void ComputeSizeRecursively(string path, CancellationToken token) if (!hFile.IsNull) { - try + do { - do + FILE_FLAGS_AND_ATTRIBUTES attributes = (FILE_FLAGS_AND_ATTRIBUTES)findData.dwFileAttributes; + + if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_REPARSE_POINT)) + // Skip symbolic links and junctions + continue; + + var itemPath = Path.Combine(directory, findData.cFileName.ToString()); + + // Skip current and parent directory entries + var fileName = findData.cFileName.ToString(); + if (fileName.Equals(".", StringComparison.OrdinalIgnoreCase) || + fileName.Equals("..", StringComparison.OrdinalIgnoreCase)) { - FILE_FLAGS_AND_ATTRIBUTES attributes = (FILE_FLAGS_AND_ATTRIBUTES)findData.dwFileAttributes; - - if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_REPARSE_POINT)) - // Skip symbolic links and junctions - continue; - - var itemPath = Path.Combine(directory, findData.cFileName.ToString()); - - // Skip current and parent directory entries - var fileName = findData.cFileName.ToString(); - if (fileName.Equals(".", StringComparison.OrdinalIgnoreCase) || - fileName.Equals("..", StringComparison.OrdinalIgnoreCase)) - { - continue; - } - - if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_DIRECTORY)) - { - queue.Enqueue(itemPath); - } - else - { - ComputeFileSize(itemPath); - } - - if (token.IsCancellationRequested) - break; + continue; } - while (PInvoke.FindNextFile(hFile, &findData)); - } - finally - { - if (!PInvoke.FindClose(hFile)) + + if (attributes.HasFlag(FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_DIRECTORY)) + { + queue.Enqueue(itemPath); + } + else { - var error = Marshal.GetLastWin32Error(); + ComputeFileSize(itemPath); } + + if (token.IsCancellationRequested) + break; } + while (PInvoke.FindNextFile(hFile, &findData)); + + PInvoke.FindClose(hFile); } } }