Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ReadDirectoryChangesW

1.9K
05 декабря 2005 года
ProgMaster
47 / / 29.08.2004
Таким вот я использую эту функцию:
Код:
// Переменные
   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);

Эта функция получает первый изменившийся файл, точнее его имя и я его использую. А как сделать, чтобы эта функция получали файлы только с определенным расширением ?
398
05 декабря 2005 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by ProgMaster
[А как сделать, чтобы эта функция получали файлы только с определенным расширением ?



Игнорировать остальные ;)

1.9K
05 декабря 2005 года
ProgMaster
47 / / 29.08.2004
Цитата:
Originally posted by Alexandoros
Игнорировать остальные ;)


Умно....а программное где и как ?

398
06 декабря 2005 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by ProgMaster

Код:
do
   {
      // Получаем указатель на первую изменившуюся запись
      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);

1.9K
06 декабря 2005 года
ProgMaster
47 / / 29.08.2004
Цитата:
Originally posted by Alexandoros


Оказалось, что проблема тут немного в другом. Я вообще это выполнил, начал дебаггить, и смотрю, что функция вообще ничего не возвращает. Ну я натравил на неё GetLastError и получил:

Цитата:
ReadDirectoryChangesW fails with ERROR_INVALID_PARAMETER when the buffer length is greater than 64 KB and the application is monitoring a directory over the network. This is due to a packet size limitation with the underlying file sharing protocols: Server Message Block (SMB) on Windows Me/98/95, and Common Internet File System (CIFS) on Windows Server 2003/XP/2000.


Я мониторю свой комп, а не сеть. Так что ошибка из-за сети отпадает. Остается только размер. Как мне тут увеличить размер до нужного ?

PS: моя программа работает как процесс...так для справки.

EDITED: Да...и как я понял он ждет лишь первого файла...Как только создан или изменен один файл - цикл вырубается. Так что парсить в цикле полюбому не правильно.

1.9K
06 декабря 2005 года
ProgMaster
47 / / 29.08.2004
А вообще сделал небольшой опыт. Все то же самое проделал на обычной проге, т.е. не регил как процесс. И все пашет !!! В чем может быть трабла ???
Вот на всякий случай код как я создаю сервис:
Код:
LPCTSTR lpszBinaryPathName = chExePath;
   
        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);
398
07 декабря 2005 года
Alexandoros
630 / / 21.10.2005
Невозможно сказать правильно ли создается сервис по этим данным. Ты уверен что в режиме сервиса она (функция)вообще запускается? Тебе нужна расширеная запись логов в файл, чтоб проследить.

Насчет цикла - ты ведь используеш синхронные вызовы, значит ReadDirectoryChangesW блокируется до изменеия в файле. То есть тебе нужен еще один цикл поверх ReadDirectoryChangesW. И все должно заработать. (+ остеивание файлов с ненужным расширением.)
1.9K
07 декабря 2005 года
ProgMaster
47 / / 29.08.2004
Цитата:
Originally posted by Alexandoros
Невозможно сказать правильно ли создается сервис по этим данным. Ты уверен что в режиме сервиса она (функция)вообще запускается? Тебе нужна расширеная запись логов в файл, чтоб проследить.

Насчет цикла - ты ведь используеш синхронные вызовы, значит ReadDirectoryChangesW блокируется до изменеия в файле. То есть тебе нужен еще один цикл поверх ReadDirectoryChangesW. И все должно заработать. (+ остеивание файлов с ненужным расширением.)


Да запускается, пробовал. Всмысле блокируется ? В режиме win32 application (not service) у меня все отслеживается так, как надо. Файлы уже отсеивать не нужно. Я думал, что сервисы не хватает INTERACT_WITH_DESKTOP но как оказалось, даже с этим не хочет работать...Воообще не понимаю в чем причина. Я думаю, что нужно чтобы кто нибудь из продвинутых кодеров написал сервис с одной лишь этой функцией, т.к. я не очень силен в дебагге.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог