Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ReadDirectoryChangesW, не приходит FILE_ACTION_RENAMED_NEW_NAME 
V
    Опции темы
soldatx
Дата 30.1.2009, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Добрый день! Прошу помощи по следующему вопросу связанному с использованием функции 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;
      }
   }

PM MAIL   Вверх
dumb
Дата 30.1.2009, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(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);
  }

PM MAIL   Вверх
soldatx
Дата 30.1.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Спасибо 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] будет содержаться следующая заполненная структура ... я похоже ошибся, ладно пасиб ещераз

PM MAIL   Вверх
dumb
Дата 30.1.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



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

дело в том, что структура FILE_NOTIFY_INFORMATION(да и многие другие из WinAPI) являет собой только заголовок возвращаемых данных - в частности, здесь в структуре описано только начало имени файла(первый символ), оставшаяся часть имени приклеивается вслед за структурой.
попытаюсь изобразить:
user posted image
поэтому и нельзя обращаться к этим данным, как к последовательно расположенным элементам массива.
PM MAIL   Вверх
soldatx
Дата 2.2.2009, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Благодарю за помощь, теперь окончательно разобрался, осталось запихать это дело в поток, и прикрутить отправку событий, но это уже другая головная боль smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0739 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.