ReadDirectoryChangesW
TCHAR szBufForRDCWFunc[1024] = {0};
DWORD dwOffset = 0;
FILE_NOTIFY_INFORMATION* pInfo = NULL;
DWORD dwBytesReturnedForRDCWFunc;
TCHAR szTmpFileName[MAX_PATH] = {0};
HANDLE hWatchDir = CreateFile("C:\\WatchDir\\", FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
// Следим за изменениями в директории
ReadDirectoryChangesW(hWatchDir, szBufForRDCWFunc, sizeof(szBufForRDCWFunc) / sizeof(TCHAR), FALSE, FILE_NOTIFY_CHANGE_CREATION|FILE_NOTIFY_CHANGE_LAST_WRITE, &dwBytesReturnedForRDCWFunc, NULL, NULL);
do
{
// Получаем указатель на первую изменившуюся запись
pInfo = (FILE_NOTIFY_INFORMATION*) &szBufForRDCWFunc[dwOffset];
WideCharToMultiByte(CP_ACP, NULL, pInfo->FileName, pInfo->FileNameLength, szTmpFileName, sizeof(szTmpFileName) / sizeof(TCHAR), NULL, NULL);
// Больше, чем одно изменение может случиться. Загружаем след запись и продолжаем
dwOffset += pInfo->NextEntryOffset;
}
while(pInfo->NextEntryOffset != 0);
Эта функция получает первый изменившийся файл, точнее его имя и я его использую. А как сделать, чтобы эта функция получали файлы только с определенным расширением ?
[А как сделать, чтобы эта функция получали файлы только с определенным расширением ?
Игнорировать остальные ;)
Игнорировать остальные ;)
Умно....а программное где и как ?
{
// Получаем указатель на первую изменившуюся запись
pInfo = (FILE_NOTIFY_INFORMATION*) &szBufForRDCWFunc[dwOffset];
//////////////////////////
// Я так понимаю где-то тут
if(!strcmp(&(pInfo->FileName[pInfo->FileNameLength - 5]), ".exe"))
{
.......
}
else
{
..........
}
//Типа так
////////////////////////
WideCharToMultiByte(CP_ACP, NULL, pInfo->FileName, pInfo->FileNameLength, szTmpFileName, sizeof(szTmpFileName) / sizeof(TCHAR), NULL, NULL);
// Больше, чем одно изменение может случиться. Загружаем след запись и продолжаем
dwOffset += pInfo->NextEntryOffset;
}
while(pInfo->NextEntryOffset != 0);
Оказалось, что проблема тут немного в другом. Я вообще это выполнил, начал дебаггить, и смотрю, что функция вообще ничего не возвращает. Ну я натравил на неё GetLastError и получил:
Я мониторю свой комп, а не сеть. Так что ошибка из-за сети отпадает. Остается только размер. Как мне тут увеличить размер до нужного ?
PS: моя программа работает как процесс...так для справки.
EDITED: Да...и как я понял он ждет лишь первого файла...Как только создан или изменен один файл - цикл вырубается. Так что парсить в цикле полюбому не правильно.
Вот на всякий случай код как я создаю сервис:
SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE service =
CreateService(
schSCManager, // SCManager database
"test", // name of service
"test", // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
lpszBinaryPathName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
StartService(service, 0, NULL);
CloseServiceHandle(service);
ExitProcess(0);
Насчет цикла - ты ведь используеш синхронные вызовы, значит ReadDirectoryChangesW блокируется до изменеия в файле. То есть тебе нужен еще один цикл поверх ReadDirectoryChangesW. И все должно заработать. (+ остеивание файлов с ненужным расширением.)
Невозможно сказать правильно ли создается сервис по этим данным. Ты уверен что в режиме сервиса она (функция)вообще запускается? Тебе нужна расширеная запись логов в файл, чтоб проследить.
Насчет цикла - ты ведь используеш синхронные вызовы, значит ReadDirectoryChangesW блокируется до изменеия в файле. То есть тебе нужен еще один цикл поверх ReadDirectoryChangesW. И все должно заработать. (+ остеивание файлов с ненужным расширением.)
Да запускается, пробовал. Всмысле блокируется ? В режиме win32 application (not service) у меня все отслеживается так, как надо. Файлы уже отсеивать не нужно. Я думал, что сервисы не хватает INTERACT_WITH_DESKTOP но как оказалось, даже с этим не хочет работать...Воообще не понимаю в чем причина. Я думаю, что нужно чтобы кто нибудь из продвинутых кодеров написал сервис с одной лишь этой функцией, т.к. я не очень силен в дебагге.