Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- char usage[] = ""
- "notify - print a name of changed object if something is is changed in a directory subtree.\n"
- "version 2.00, 2011-06-08\n"
- "(C) Dmitry Koterov (dmitry@koterov.ru)\n"
- "dkLab RealSync project, http://en.dklab.ru/lib/dklab_realsync/\n\n"
- "Usage:\n"
- " notify.exe <any-path-to-watch>\n"
- ;
- #include <windows.h>
- #include <stdio.h>
- #include <cstdint>
- #include <cassert>
- #include <locale>
- // EXE-file type.
- #pragma comment(linker, "/SUBSYSTEM:console")
- int main(int argc, char* argv[]) {
- setlocale(LC_ALL, "ru-RU");
- _wsetlocale(LC_ALL, L"ru-RU");
- if (!argv[1] || !*argv[1]) {
- fprintf(stderr, "%s", usage);
- ExitProcess(1);
- }
- char* path = argv[1];
- HANDLE file = CreateFile(path,
- FILE_LIST_DIRECTORY,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- NULL,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
- NULL);
- assert(file != INVALID_HANDLE_VALUE);
- OVERLAPPED overlapped;
- overlapped.hEvent = CreateEvent(NULL, FALSE, 0, NULL);
- uint8_t change_buf[1024];
- BOOL success = ReadDirectoryChangesW(
- file, change_buf, 1024, TRUE,
- FILE_NOTIFY_CHANGE_FILE_NAME |
- FILE_NOTIFY_CHANGE_DIR_NAME |
- FILE_NOTIFY_CHANGE_LAST_WRITE,
- NULL, &overlapped, NULL);
- while (true) {
- DWORD result = WaitForSingleObject(overlapped.hEvent, 0);
- if (result == WAIT_OBJECT_0) {
- DWORD bytes_transferred;
- GetOverlappedResult(file, &overlapped, &bytes_transferred, FALSE);
- FILE_NOTIFY_INFORMATION* event = (FILE_NOTIFY_INFORMATION*)change_buf;
- for (;;) {
- DWORD name_len = event->FileNameLength / sizeof(wchar_t);
- switch (event->Action) {
- case FILE_ACTION_ADDED: {
- wprintf(L" Added: %.*s\n", name_len, event->FileName);
- } break;
- case FILE_ACTION_REMOVED: {
- wprintf(L" Removed: %.*s\n", name_len, event->FileName);
- } break;
- case FILE_ACTION_MODIFIED: {
- wprintf(L" Modified: %.*s\n", name_len, event->FileName);
- } break;
- case FILE_ACTION_RENAMED_OLD_NAME: {
- wprintf(L"Renamed from: %.*s\n", name_len, event->FileName);
- } break;
- case FILE_ACTION_RENAMED_NEW_NAME: {
- wprintf(L" to: %.*s\n", name_len, event->FileName);
- } break;
- default: {
- printf("Unknown action!\n");
- } break;
- }
- // Are there more events to handle?
- if (event->NextEntryOffset) {
- *((uint8_t**)&event) += event->NextEntryOffset;
- }
- else {
- break;
- }
- }
- // Queue the next event
- BOOL success = ReadDirectoryChangesW(
- file, change_buf, 1024, TRUE,
- FILE_NOTIFY_CHANGE_FILE_NAME |
- FILE_NOTIFY_CHANGE_DIR_NAME |
- FILE_NOTIFY_CHANGE_LAST_WRITE,
- NULL, &overlapped, NULL);
- }
- // Do other loop stuff here...
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement