From 1964a336c136a570cb2bd53f504f1b9534ff731d Mon Sep 17 00:00:00 2001 From: Saravanan Ganapathi Date: Fri, 7 Nov 2025 15:08:12 +0530 Subject: [PATCH 1/2] Fix: Fixed an issue where deleting a folder containing locked files showed a generic error message "The file you are attempting to access is currently being used by another application" instead of identifying the specific file and process. --- .../Operations/ShellFilesystemOperations.cs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Files.App/Utils/Storage/Operations/ShellFilesystemOperations.cs b/src/Files.App/Utils/Storage/Operations/ShellFilesystemOperations.cs index 1db895210523..9714bb0e98af 100644 --- a/src/Files.App/Utils/Storage/Operations/ShellFilesystemOperations.cs +++ b/src/Files.App/Utils/Storage/Operations/ShellFilesystemOperations.cs @@ -415,7 +415,31 @@ public async Task DeleteItemsAsync(IList else if (deleteResult.Items.Any(x => CopyEngineResult.Convert(x.HResult) == FileSystemStatusCode.InUse)) { var failedSources = deleteResult.Items.Where(x => CopyEngineResult.Convert(x.HResult) == FileSystemStatusCode.InUse); - var filePath = failedSources.Select(x => x.Source); // When deleting only source can be in use but shell returns COPYENGINE_E_SHARING_VIOLATION_DEST for folders + + var lockedFiles = new List(); + foreach (var failedSource in failedSources) + { + if (Directory.Exists(failedSource.Source)) + { + try + { + var files = Directory.EnumerateFiles(failedSource.Source, "*", SearchOption.AllDirectories); + foreach (var file in files) + { + var procs = SafetyExtensions.IgnoreExceptions(() => FileOperationsHelpers.CheckFileInUse(new[] { file }), App.Logger); + if (procs is not null && procs.Any()) + lockedFiles.Add(file); + } + } + catch { } + } + else if (File.Exists(failedSource.Source)) + { + lockedFiles.Add(failedSource.Source); + } + } + + var filePath = lockedFiles.Any() ? lockedFiles : failedSources.Select(x => x.Source); var lockingProcess = WhoIsLocking(filePath); switch (await GetFileInUseDialog(filePath, lockingProcess)) From 5e6629f6014f2fe3ba69173ba6165bd10c66732f Mon Sep 17 00:00:00 2001 From: Saravanan Ganapathi Date: Fri, 7 Nov 2025 15:28:10 +0530 Subject: [PATCH 2/2] Fix: Batch file lock checks in folder deletion --- .../Storage/Operations/ShellFilesystemOperations.cs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/Files.App/Utils/Storage/Operations/ShellFilesystemOperations.cs b/src/Files.App/Utils/Storage/Operations/ShellFilesystemOperations.cs index 9714bb0e98af..c89155f375e3 100644 --- a/src/Files.App/Utils/Storage/Operations/ShellFilesystemOperations.cs +++ b/src/Files.App/Utils/Storage/Operations/ShellFilesystemOperations.cs @@ -416,7 +416,7 @@ public async Task DeleteItemsAsync(IList { var failedSources = deleteResult.Items.Where(x => CopyEngineResult.Convert(x.HResult) == FileSystemStatusCode.InUse); - var lockedFiles = new List(); + var filesToCheck = new List(); foreach (var failedSource in failedSources) { if (Directory.Exists(failedSource.Source)) @@ -424,22 +424,17 @@ public async Task DeleteItemsAsync(IList try { var files = Directory.EnumerateFiles(failedSource.Source, "*", SearchOption.AllDirectories); - foreach (var file in files) - { - var procs = SafetyExtensions.IgnoreExceptions(() => FileOperationsHelpers.CheckFileInUse(new[] { file }), App.Logger); - if (procs is not null && procs.Any()) - lockedFiles.Add(file); - } + filesToCheck.AddRange(files); } catch { } } else if (File.Exists(failedSource.Source)) { - lockedFiles.Add(failedSource.Source); + filesToCheck.Add(failedSource.Source); } } - var filePath = lockedFiles.Any() ? lockedFiles : failedSources.Select(x => x.Source); + var filePath = filesToCheck.Any() ? filesToCheck : failedSources.Select(x => x.Source); var lockingProcess = WhoIsLocking(filePath); switch (await GetFileInUseDialog(filePath, lockingProcess))