static void CALLBACK notif(DWORD status, DWORD tferred, LPOVERLAPPED over) { auto* task = (FileSystemWatcherTask*)over->hEvent; if (status == ERROR_OPERATION_ABORTED) { task->m_finished = true; return; } FILE_NOTIFY_INFORMATION* info = &task->m_info[0]; while (info) { auto action = info->Action; switch (action) { case FILE_ACTION_RENAMED_NEW_NAME: case FILE_ACTION_ADDED: case FILE_ACTION_MODIFIED: case FILE_ACTION_REMOVED: { char tmp[MAX_PATH]; wcharToCharArray(info->FileName, tmp, info->FileNameLength); task->m_watcher.m_callback.invoke(tmp); } break; case FILE_ACTION_RENAMED_OLD_NAME: break; default: ASSERT(false); break; } info = info->NextEntryOffset == 0 ? nullptr : (FILE_NOTIFY_INFORMATION*)(((char*)info) + info->NextEntryOffset); } }
static void CALLBACK callback(DWORD errorCode, DWORD tferred, LPOVERLAPPED over) { if (errorCode > 0) { return; } FileSystemWatcherPC* watcher = (FileSystemWatcherPC*)over->hEvent; if (tferred > 0) { FILE_NOTIFY_INFORMATION* info = &watcher->m_info[0]; while (info) { switch (info->Action) { case FILE_ACTION_RENAMED_NEW_NAME: case FILE_ACTION_ADDED: case FILE_ACTION_MODIFIED: { char tmp[MAX_PATH]; wcharToCharArray( info->FileName, tmp, info->FileNameLength); watcher->m_callback.invoke(tmp); // watcher->m_asset_browser->emitFileChanged(tmp); } break; case FILE_ACTION_RENAMED_OLD_NAME: case FILE_ACTION_REMOVED: // do not do anything break; default: ASSERT(false); break; } info = info->NextEntryOffset == 0 ? nullptr : (FILE_NOTIFY_INFORMATION*)(((char*)info) + info->NextEntryOffset); } } BOOL b = ReadDirectoryChangesW(watcher->m_handle, watcher->m_info, sizeof(watcher->m_info), TRUE, READ_DIR_CHANGE_FILTER, &watcher->m_received, &watcher->m_overlapped, callback); ASSERT(b); }