Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > ReadDirectoryChangesW


Автор: soldatx 30.1.2009, 07:59
Добрый день! Прошу помощи по следующему вопросу связанному с использованием функции ReadDirectoryChangesW. По какойто причине не приходит уведомление FILE_ACTION_RENAMED_NEW_NAME, при это все остальные уведомления приходят корректно!

вот собственно код который я использую :

Код


 HANDLE hDir = CreateFile( "c:\\temp", // pointer to the file name
      FILE_GENERIC_READ,                // access (read/write) mode
    FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,  // share mode
    NULL,                               // security descriptor
    OPEN_EXISTING,                      // how to create
    FILE_FLAG_BACKUP_SEMANTICS,         // file attributes
    NULL                                // file with attributes to copy
  );

 FILE_NOTIFY_INFORMATION Buffer[1024];
  DWORD nBufSize = sizeof(Buffer);

  DWORD BytesReturned;
  while( ReadDirectoryChangesW(
                                hDir,                                  // handle to directory
                                &Buffer,                                    // read results buffer
                                nBufSize,                                // length of buffer
                                TRUE,                                 // monitoring option
                                FILE_NOTIFY_CHANGE_SECURITY|
                                FILE_NOTIFY_CHANGE_CREATION|
                                FILE_NOTIFY_CHANGE_LAST_ACCESS|
                                FILE_NOTIFY_CHANGE_LAST_WRITE|
                                FILE_NOTIFY_CHANGE_SIZE|
                                FILE_NOTIFY_CHANGE_ATTRIBUTES|
                                FILE_NOTIFY_CHANGE_DIR_NAME|
                                FILE_NOTIFY_CHANGE_FILE_NAME,             // filter conditions
                                &BytesReturned,              // bytes returned
                                NULL,                          // overlapped buffer
                                NULL// completion routine
                                ))
    {



    string helper_txt;
    switch(Buffer[0].Action)
      {
      case FILE_ACTION_ADDED: helper_txt = "The file was added to the directory"; break; 
      case FILE_ACTION_REMOVED: helper_txt = "The file was removed from the directory"; break; 
      case FILE_ACTION_MODIFIED: helper_txt = "The file was modified. This can be a change in the time stamp or attributes."; break; 
      case FILE_ACTION_RENAMED_OLD_NAME: helper_txt = "The file was renamed and this is the old name."; break; 
      case FILE_ACTION_RENAMED_NEW_NAME: helper_txt = "The file was renamed and this is the new name."; MessageBox(0,"","",MB_OK); break;
      }
   }

Автор: dumb 30.1.2009, 08:41
Цитата(soldatx @  30.1.2009,  07:59 Найти цитируемый пост)
По какойто причине не приходит уведомление FILE_ACTION_RENAMED_NEW_NAME

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

char *Buffer = new char[8192];
...
while( ReadDirectoryChangesW(...
{
  PFILE_NOTIFY_INFORMATION p = reinterpret_cast<PFILE_NOTIFY_INFORMATION>(Buffer);
  for (;;)
  {
    switch(p->Action)
    {...
    }
    if (!p->NextEntryOffset) break;
    p = reinterpret_cast<PFILE_NOTIFY_INFORMATION>(reinterpret_cast<PBYTE>(p) + p->NextEntryOffset);
  }

Автор: soldatx 30.1.2009, 10:43
Спасибо dumb. Я видемо далеко не все еще понимаю. Так как ты написал работает. Прежде чем задавать такие вопроссы сначала почитаю книжек лучше!
почуму только так не работало
Код

string helper_txt;
    int i = 0;
    for(;;)
    {
    switch(Buffer[i].Action)
      {
      case FILE_ACTION_ADDED: helper_txt = "The file was added to the directory"; break; 
      case FILE_ACTION_REMOVED: helper_txt = "The file was removed from the directory"; break; 
      case FILE_ACTION_MODIFIED: helper_txt = "The file was modified. This can be a change in the time stamp or attributes."; break; 
      case FILE_ACTION_RENAMED_OLD_NAME: helper_txt = "The file was renamed and this is the old name."; break; 
      case FILE_ACTION_RENAMED_NEW_NAME: helper_txt = "The file was renamed and this is the new name."; MessageBox(0,"","",MB_OK); break;
      }
    
    if ( Buffer[i].NextEntryOffset==) break;
        i++;
    }

я думал в Buffer[i] будет содержаться следующая заполненная структура ... я похоже ошибся, ладно пасиб ещераз

Автор: dumb 30.1.2009, 13:37
Цитата(soldatx @  30.1.2009,  10:43 Найти цитируемый пост)
я думал в Buffer[i] будет содержаться следующая заполненная структура ...

дело в том, что структура FILE_NOTIFY_INFORMATION(да и многие другие из WinAPI) являет собой только заголовок возвращаемых данных - в частности, здесь в структуре описано только начало имени файла(первый символ), оставшаяся часть имени приклеивается вслед за структурой.
попытаюсь изобразить:
http://ipicture.ru/
поэтому и нельзя обращаться к этим данным, как к последовательно расположенным элементам массива.

Автор: soldatx 2.2.2009, 06:35
Благодарю за помощь, теперь окончательно разобрался, осталось запихать это дело в поток, и прикрутить отправку событий, но это уже другая головная боль smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)