Something went wrong. Try again.
Reactos
Something went wrong. Try again.
C
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158/* * FILE: notificationtest.c * PURPOSE: Files notifications testing * NOTES: MSDN code from: https://learn.microsoft.com/en-us/windows/win32/fileio/obtaining-directory-change-notifications */
#include <windows.h>#include <stdlib.h>#include <stdio.h>#include <tchar.h>
#if defined(_tsplitpath) && !defined(_tsplitpath_s)#define _tsplitpath_s(f, d,dl, p,pl, n,nl, e,el) _tsplitpath(f, d, p, n, e)#else#define _wsplitpath_s(f, d,dl, p,pl, n,nl, e,el) _wsplitpath(f, d, p, n, e)#define _splitpath_s(f, d,dl, p,pl, n,nl, e,el) _splitpath(f, d, p, n, e)#endif
void RefreshDirectory(LPTSTR);void RefreshTree(LPTSTR);void WatchDirectory(LPTSTR);
int _tmain(int argc, TCHAR *argv[]){ if(argc != 2) { _tprintf(TEXT("Usage: %s <dir>\n"), argv[0]); return -1; }
WatchDirectory(argv[1]);
return 0;}
void WatchDirectory(LPTSTR lpDir){ DWORD dwWaitStatus; HANDLE dwChangeHandles[2]; TCHAR lpDrive[4]; TCHAR lpFile[_MAX_FNAME]; TCHAR lpExt[_MAX_EXT];
_tsplitpath_s(lpDir, lpDrive, 4, NULL, 0, lpFile, _MAX_FNAME, lpExt, _MAX_EXT);
lpDrive[2] = (TCHAR)'\\'; lpDrive[3] = (TCHAR)'\0';
// Watch the directory for file creation and deletion.
dwChangeHandles[0] = FindFirstChangeNotification( lpDir, // directory to watch FALSE, // do not watch subtree FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) { printf("\n ERROR: FindFirstChangeNotification function failed.\n"); ExitProcess(GetLastError()); }
// Watch the subtree for directory creation and deletion.
dwChangeHandles[1] = FindFirstChangeNotification( lpDrive, // directory to watch TRUE, // watch the subtree FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir name changes
if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) { printf("\n ERROR: FindFirstChangeNotification function failed.\n"); ExitProcess(GetLastError()); }
// Make a final validation check on our handles.
if ((dwChangeHandles[0] == NULL) || (dwChangeHandles[1] == NULL)) { printf("\n ERROR: Unexpected NULL from FindFirstChangeNotification.\n"); ExitProcess(GetLastError()); }
// Change notification is set. Now wait on both notification// handles and refresh accordingly.
while (TRUE) { // Wait for notification.
printf("\nWaiting for notification...\n");
dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, FALSE, INFINITE);
switch (dwWaitStatus) { case WAIT_OBJECT_0:
// A file was created, renamed, or deleted in the directory. // Refresh this directory and restart the notification.
RefreshDirectory(lpDir); if ( FindNextChangeNotification(dwChangeHandles[0]) == FALSE ) { printf("\n ERROR: FindNextChangeNotification function failed.\n"); ExitProcess(GetLastError()); } break;
case WAIT_OBJECT_0 + 1:
// A directory was created, renamed, or deleted. // Refresh the tree and restart the notification.
RefreshTree(lpDrive); if (FindNextChangeNotification(dwChangeHandles[1]) == FALSE ) { printf("\n ERROR: FindNextChangeNotification function failed.\n"); ExitProcess(GetLastError()); } break;
case WAIT_TIMEOUT:
// A timeout occurred, this would happen if some value other // than INFINITE is used in the Wait call and no changes occur. // In a single-threaded environment you might not want an // INFINITE wait.
printf("\nNo changes in the timeout period.\n"); break;
default: printf("\n ERROR: Unhandled dwWaitStatus.\n"); ExitProcess(GetLastError()); break; } }}
void RefreshDirectory(LPTSTR lpDir){ // This is where you might place code to refresh your // directory listing, but not the subtree because it // would not be necessary.
_tprintf(TEXT("Directory (%s) changed.\n"), lpDir);}
void RefreshTree(LPTSTR lpDrive){ // This is where you might place code to refresh your // directory listing, including the subtree.
_tprintf(TEXT("Directory tree (%s) changed.\n"), lpDrive);}