Skip to content

Commit 0dc2cc7

Browse files
committed
Improve WatchForGitChanges method with CsWin32
[wip]
1 parent 71b9e0c commit 0dc2cc7

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

src/Files.App.CsWin32/NativeMethods.txt

+3
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,6 @@ GdipCreateBitmapFromScan0
223223
BITMAP
224224
GetObject
225225
CancelIoEx
226+
OVERLAPPED
227+
CreateEvent
228+
ReadDirectoryChangesW

src/Files.App/ViewModels/ShellViewModel.cs

+26-18
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using Vanara.Windows.Shell;
1717
using Windows.Win32;
1818
using Windows.Win32.Foundation;
19+
using Windows.Win32.Storage.FileSystem;
1920
using Windows.Foundation;
2021
using Windows.Storage;
2122
using Windows.Storage.FileProperties;
@@ -25,6 +26,8 @@
2526
using FileAttributes = System.IO.FileAttributes;
2627
using ByteSize = ByteSizeLib.ByteSize;
2728
using Windows.Win32.System.SystemServices;
29+
using FINDEX_SEARCH_OPS = Windows.Win32.Storage.FileSystem.FINDEX_SEARCH_OPS;
30+
using FINDEX_INFO_LEVELS = Windows.Win32.Storage.FileSystem.FINDEX_INFO_LEVELS;
2831

2932
namespace Files.App.ViewModels
3033
{
@@ -1750,7 +1753,7 @@ await DialogDisplayHelper.ShowDialogAsync(
17501753
var findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
17511754
var additionalFlags = FIND_FIRST_EX_LARGE_FETCH;
17521755

1753-
IntPtr hFileTsk = FindFirstFileExFromApp(
1756+
IntPtr hFileTsk = PInvoke.FindFirstFileEx(
17541757
path + "\\*.*",
17551758
findInfoLevel,
17561759
out WIN32_FIND_DATA findDataTsk,
@@ -2215,16 +2218,20 @@ private unsafe void WatchForDirectoryChanges(string path, CloudDriveSyncStatus s
22152218

22162219
private unsafe void WatchForGitChanges()
22172220
{
2218-
var hWatchDir = Win32PInvoke.CreateFileFromApp(
2219-
GitDirectory!,
2220-
1,
2221-
1 | 2 | 4,
2222-
IntPtr.Zero,
2223-
3,
2224-
(uint)Win32PInvoke.File_Attributes.BackupSemantics | (uint)Win32PInvoke.File_Attributes.Overlapped,
2225-
IntPtr.Zero);
2221+
HANDLE hWatchDir;
22262222

2227-
if (hWatchDir.ToInt64() == -1)
2223+
fixed (char* gitDir = GitDirectory)
2224+
{
2225+
hWatchDir = PInvoke.CreateFile(
2226+
gitDir!,
2227+
1,
2228+
FILE_SHARE_MODE.FILE_SHARE_READ | FILE_SHARE_MODE.FILE_SHARE_WRITE | FILE_SHARE_MODE.FILE_SHARE_DELETE,
2229+
dwCreationDisposition: FILE_CREATION_DISPOSITION.OPEN_EXISTING,
2230+
dwFlagsAndAttributes: FILE_FLAGS_AND_ATTRIBUTES.FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAGS_AND_ATTRIBUTES.FILE_FLAG_OVERLAPPED,
2231+
hTemplateFile: (HANDLE)null);
2232+
}
2233+
2234+
if (hWatchDir.IsNull)
22282235
return;
22292236

22302237
gitProcessQueueAction ??= Task.Factory.StartNew(() => ProcessGitChangesQueueAsync(watcherCTS.Token), default,
@@ -2236,8 +2243,8 @@ private unsafe void WatchForGitChanges()
22362243
var rand = Guid.NewGuid();
22372244
var notifyFilters = FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_CREATION;
22382245

2239-
var overlapped = new OVERLAPPED();
2240-
overlapped.hEvent = CreateEvent(IntPtr.Zero, false, false, null);
2246+
var overlapped = new Overlapped();
2247+
overlapped.EventHandleIntPtr = PInvoke.CreateEvent((bManualReset: false, bInitialState: false, lpName: null);
22412248
const uint INFINITE = 0xFFFFFFFF;
22422249

22432250
while (x.Status != AsyncStatus.Canceled)
@@ -2250,15 +2257,16 @@ private unsafe void WatchForGitChanges()
22502257
if (x.Status == AsyncStatus.Canceled)
22512258
break;
22522259

2253-
ReadDirectoryChangesW(hWatchDir, pBuff,
2260+
PInvoke.ReadDirectoryChanges(hWatchDir, pBuff,
22542261
4096, true,
2255-
notifyFilters, null,
2256-
ref overlapped, null);
2262+
notifyFilters,
2263+
lpOverlapped: ref overlapped,
2264+
lpCompletionRoutine: null);
22572265

22582266
if (x.Status == AsyncStatus.Canceled)
22592267
break;
22602268

2261-
var rc = WaitForSingleObjectEx(overlapped.hEvent, INFINITE, true);
2269+
var rc = WaitForSingleObjectEx(overlapped.EventHandleIntPtr, INFINITE, true);
22622270

22632271
uint offset = 0;
22642272
ref var notifyInfo = ref Unsafe.As<byte, FILE_NOTIFY_INFORMATION>(ref buff[offset]);
@@ -2282,7 +2290,7 @@ private unsafe void WatchForGitChanges()
22822290
}
22832291
}
22842292

2285-
CloseHandle(overlapped.hEvent);
2293+
PInvoke.CloseHandle((HANDLE)overlapped.EventHandleIntPtr);
22862294
gitChangesQueue.Clear();
22872295
});
22882296

@@ -2296,7 +2304,7 @@ private unsafe void WatchForGitChanges()
22962304
gitWatcherAction = null;
22972305
}
22982306

2299-
PInvoke.CancelIoEx((HANDLE)hWatchDir);
2307+
PInvoke.CancelIoEx(hWatchDir);
23002308
CloseHandle(hWatchDir);
23012309
});
23022310
}

0 commit comments

Comments
 (0)