Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fixes files-community#16538 by using FindClose instead of CloseHandle
  • Loading branch information
primetime43 committed Feb 19, 2025
1 parent c7949b4 commit e24a7d2
Showing 1 changed file with 39 additions and 24 deletions.
63 changes: 39 additions & 24 deletions src/Files.App/Utils/Storage/Operations/FileSizeCalculator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System.Collections.Concurrent;
using System.IO;
using System.Runtime.InteropServices;
using Windows.Win32;
using Windows.Win32.Storage.FileSystem;

Expand All @@ -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));
Expand Down Expand Up @@ -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);
}
}
}
Expand Down

0 comments on commit e24a7d2

Please sign in to comment.