Skip to content

Commit 074e2c3

Browse files
committed
Fixed Recycle Bin deletion logic on WinFsp
1 parent 5ddd83a commit 074e2c3

2 files changed

Lines changed: 17 additions & 7 deletions

File tree

src/Core/SecureFolderFS.Core.WinFsp/Callbacks/OnDeviceWinFsp.Helpers.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ private static FileOptions ToFileOptions(uint createOptions)
7171
if ((createOptions & FILE_RANDOM_ACCESS) != 0)
7272
options |= FileOptions.RandomAccess;
7373

74-
if ((createOptions & FILE_DELETE_ON_CLOSE) != 0)
75-
options |= FileOptions.DeleteOnClose;
74+
// Never handle DELETE_ON_CLOSE
75+
// WinFsp already tracks the delete disposition and will call Cleanup with CleanupDelete.
76+
// Letting the real FileStream have DeleteOnClose bypasses your custom DeleteOrRecycle logic.
7677

7778
return options;
7879
}

src/Core/SecureFolderFS.Core.WinFsp/Callbacks/OnDeviceWinFsp.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -912,23 +912,32 @@ public override void Cleanup(
912912
}
913913
}
914914

915-
// Close handle first
916-
CloseHandle(FileDesc);
917-
InvalidateContext(out FileDesc);
918-
Trace(STATUS_SUCCESS, FileName);
919-
920915
try
921916
{
922917
if (pathToDelete is null)
923918
return;
924919

920+
var exists = File.Exists(pathToDelete) || Directory.Exists(pathToDelete);
921+
if (!exists)
922+
{
923+
Trace(STATUS_OBJECT_NAME_NOT_FOUND, FileName);
924+
return;
925+
}
926+
925927
// Then delete
926928
NativeRecycleBinHelpers.DeleteOrRecycle(pathToDelete, _specifics, storableType);
929+
Trace(STATUS_SUCCESS, FileName);
927930
}
928931
catch (Exception)
929932
{
930933
Trace(STATUS_UNSUCCESSFUL, FileName);
931934
}
935+
finally
936+
{
937+
// Close handle
938+
CloseHandle(FileDesc);
939+
InvalidateContext(out FileDesc);
940+
}
932941
}
933942

934943
/// <inheritdoc/>

0 commit comments

Comments
 (0)