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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ReadDirectoryChangesW, повторно возвращает одно и то же 
:(
    Опции темы
jnb
Дата 25.10.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет.

Ставлю папку на мониторинг функцией ReadDirectoryChangesW.
Жду ивента. Когда файл в папке изменяется, ивент устанавливается
и я могу получить имя файла.
Все происходит в цикле, поэтому опять запускается ReadDirectoryChangesW.
И тут же сообщает о изменении файла. Хотя ничего не менялось.

Вобщем о изменении одного файла функция извещает дважды.
Кто-нибудь сталкивался с такой проблемой? Как она решается?
PM MAIL   Вверх
dumb
Дата 25.10.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(Правила форума)

  Приводите часть кода, в которй предположительно находится проблема или ошибка.

smile
PM MAIL   Вверх
jnb
Дата 25.10.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот он:
Код

HANDLE hDirectory = CreateFile(_T("C:\\1"), FILE_LIST_DIRECTORY, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_FLAG_BACKUP_SEMANTICS, NULL);
    if (hDirectory == NULL)
        return;

    BYTE pBuffer[1024];
    const DWORD dwBufferLength = sizeof(pBuffer);

    DWORD dwSizeFake;

    HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);


    OVERLAPPED ov;
    ov.hEvent = hEvent;

    CString sFile;
    CFile file(_T("file.log"), CFile::modeCreate | CFile::modeWrite);
    int n = 0;

    DWORD dwOffset = 0;

    while(1)
    {
        ReadDirectoryChangesW(
            hDirectory,
            pBuffer + dwOffset,
            dwBufferLength - dwOffset,
            TRUE,
            FILE_NOTIFY_CHANGE_LAST_WRITE,
            &dwSizeFake,
            &ov,
            NULL);

        DWORD dwRes = WaitForSingleObject(hEvent, INFINITE);
        if (dwRes == WAIT_OBJECT_0)
        {

            ResetEvent(hEvent);
            DWORD dwSize = 0;
            BOOL bRes = GetOverlappedResult(hDirectory, &ov, &dwSize, FALSE);
            if (bRes == FALSE)
                AfxMessageBox(_T("Bad results"));


            FILE_NOTIFY_INFORMATION* pFni = (FILE_NOTIFY_INFORMATION*)(pBuffer + dwOffset);
            while(1)
            {    
                TRACE("---\n");
                file.Write(pFni->FileName, pFni->FileNameLength);
                wmemcpy(sFile.GetBufferSetLength(pFni->FileNameLength), pFni->FileName, pFni->FileNameLength);
                sFile.ReleaseBuffer(pFni->FileNameLength / 2);
                TRACE(_T("%s - %d\n"), (LPCTSTR)sFile, pFni->Action);
                file.Flush();                
                dwOffset += 200; //sizeof(FILE_NOTIFY_INFORMATION) + pFni->FileNameLength - sizeof(pFni->FileName);
                if (pFni->NextEntryOffset == 0)
                    break;
                pFni = pFni + pFni->NextEntryOffset;
            }            
        }

        n++;
        if (n == 5)
            break;        
    }

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


sceloglauxalbifacies
****


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

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



хм. оно у тебя работает?! smile

ну да не суть... кол-во приходящих FILE_NOTIFY_CHANGE_LAST_WRITE в большей степени зависит от программы, меняющей файлы. например, файловые менеджеры и редакторы колдуют также и с установкой времени, что тоже вызывает "приход".

в общем, точная схема работы этой функции не совсем понятна, но некие закономерности имеются... smile
если не лень, можешь погуглить на предмет IRP_MJ_DIRECTORY_CONTROL:IRP_MN_NOTIFY_CHANGE_DIRECTORY...

чтобы избежать "повторных" срабатываний у себя в программе используй какие-нибудь дополнительные "костыли" с таймерами, например... т.е. в течение, скажем, секунды, не отдавай "наружу" извещения, а накапливай...
PM MAIL   Вверх
jnb
Дата 27.10.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(dumb @  26.10.2006,  04:34 Найти цитируемый пост)
хм. оно у тебя работает?! 

Это был тестик. 
И потому я его сразу не выкладывал, так как к проблеме он отношения не имел.


Цитата(dumb @  26.10.2006,  04:34 Найти цитируемый пост)
ну да не суть... кол-во приходящих FILE_NOTIFY_CHANGE_LAST_WRITE в большей степени зависит от программы, меняющей файлы. например, файловые менеджеры и редакторы колдуют также и с установкой времени, что тоже вызывает "приход".


Вот видишь, тебе даже код не надо, что бы мне помочь  smile . 
Спасибо!


Цитата(dumb @  26.10.2006,  04:34 Найти цитируемый пост)
чтобы избежать "повторных" срабатываний у себя в программе используй какие-нибудь дополнительные "костыли" с таймерами, например... т.е. в течение, скажем, секунды, не отдавай "наружу" извещения, а накапливай... 


Что-нибудь приделаю.
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.0417 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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