Слежу за изменениями файлов в папке. Есть вот такой код:
| Код | AnsiString dir = Form2->Edit1->Text; HANDLE hdir = CreateFile(dir.c_str(), FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS/*|FILE_FLAG_OVERLAPPED*/, NULL); FILE_NOTIFY_INFORMATION Buffer[1024]; DWORD BytesReturned;
while ( true) { int ret = ReadDirectoryChangesW( hdir, &Buffer, sizeof(Buffer), True, FILE_NOTIFY_CHANGE_SECURITY| FILE_NOTIFY_CHANGE_SIZE| FILE_NOTIFY_CHANGE_ATTRIBUTES| FILE_NOTIFY_CHANGE_DIR_NAME| FILE_NOTIFY_CHANGE_FILE_NAME, &BytesReturned, NULL, NULL );
name = Buffer[0].FileName; switch(Buffer[0].Action) { case FILE_ACTION_ADDED: Memo1->Lines->Add("Файл добавлен"+ name); break; case FILE_ACTION_REMOVED: Memo1->Lines->Add("Файл удален"+ name); break; case FILE_ACTION_MODIFIED: Memo1->Lines->Add("Файл изменен"+ name); break; } break; } CloseHandle(hdir); delete [] Buffer;
|
Проблема в том, что работает он синхронно, в результате чего программа зависает и ждет изменений в папке, и только после них прога отвисает. Хотелось бы сделать ассинхронно, но что то не заладилось. Либо как можно прервать выполнение данной процедуры через некоторое время по таймеру, если никаких действий не происходит. И еще один вопрос: иногда к имени файла дописывается лишние символы, как исправить? Помогите, пожалуйста. |