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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ReadDirectoryChangesW: странности логгируются, Вокруг ивента FILE_ACTION_MODIFIED 
:(
    Опции темы
malor
  Дата 6.4.2012, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Функция ReadDirectoryChangesW() запущена внутри потока. Следит за изменением файла somefile.dat внутри каталога.
В случае, если он был подвергнут модификации - делает отметку в лог-файле с указанием времени.

Код
// Только строчку с временем пишем
void SomeAction()
{
    char sMsg[MAX_LENGHT_MSG] = "";  
    time_t t = time(NULL);
    struct tm * tm = localtime(&t);
    strcat(sMsg, asctime(tm));

    SaveLog(sMsg);
}

// Функция потока
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
    char sMsg[MAX_LENGHT_MSG] = "";  

    char buf[256 * (sizeof(FILE_NOTIFY_INFORMATION) + MAX_PATH * sizeof(WCHAR))] = {0};
    DWORD bytesReturned = 0;
    BOOL result = FALSE;
    FILE_NOTIFY_INFORMATION *fni = NULL;

    HANDLE hDir = CreateFile(pathDir,
        FILE_LIST_DIRECTORY | STANDARD_RIGHTS_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS,
        NULL);
         
    if (!hDir || hDir == INVALID_HANDLE_VALUE)
    {
        wprintf(L"CreateFile failed\n");
        return 1;
    }

    while (1)
    {
        result = ReadDirectoryChangesW(hDir,
            buf,
            sizeof(buf) / sizeof(*buf),
            TRUE,                                
            FILE_NOTIFY_CHANGE_FILE_NAME |
                FILE_NOTIFY_CHANGE_DIR_NAME |
                FILE_NOTIFY_CHANGE_ATTRIBUTES |
                FILE_NOTIFY_CHANGE_SIZE |
                FILE_NOTIFY_CHANGE_LAST_WRITE |
                FILE_NOTIFY_CHANGE_LAST_ACCESS |
                FILE_NOTIFY_CHANGE_CREATION |
                FILE_NOTIFY_CHANGE_SECURITY,
            &bytesReturned,
            NULL,
            NULL);

        if (result && bytesReturned)
        {
            wchar_t filename[MAX_PATH];
            wchar_t action[256];
            for (fni = (FILE_NOTIFY_INFORMATION*)buf; fni; )
            {
                if (fni->FileNameLength)
                {
                    wcsncpy_s(filename, MAX_PATH, fni->FileName, fni->FileNameLength / 2);
                    filename[fni->FileNameLength / 2] = 0;
                    // События с другими файлами в директории не интересуют
                    if (wcsncmp(L"somefile.dat", filename, wcslen(filename)) != 0)
                    {
                        if (fni->NextEntryOffset)
                        {
                            char *p = (char*)fni;
                            fni = (FILE_NOTIFY_INFORMATION*)(p + fni->NextEntryOffset);
                        }
                        else
                        {
                            fni = NULL;
                        }                    
                        continue;
                    }

                }
                else
                {
                    //wprintf(L"%s <EMPTY>\n", action);
                }   

                switch (fni->Action)
                {

                case FILE_ACTION_MODIFIED:
                    strncat(sMsg, "File modified", 13);
                    SaveLog(sMsg);
                    SomeAction();      
                    break;

                default:
                    ;//swprintf_s(action, sizeof(action) / sizeof(*action), L"Unkonwn action: %ld. File name is:", fni->Action);
                }
                

                if (fni->NextEntryOffset)
                {
                    char *p = (char*)fni;
                    fni = (FILE_NOTIFY_INFORMATION*)(p + fni->NextEntryOffset);
                }
                else
                {
                    fni = NULL;
                }
            }
        }
        else
        {
            wprintf(L"ReadDirectoryChangesW failed\n");
        }
    }

    CloseHandle(hDir);
    
    return 0;
}


А теперь сам лог:
Цитата
File modified
Fri Apr 06 12:19:25 2012

File modified
File modified
Fri Apr 06 12:19:25 2012

File modified
File modified
File modified
Fri Apr 06 12:19:38 2012

File modified
File modified
File modified
File modified
Fri Apr 06 12:19:38 2012

File modified
File modified
File modified
File modified
File modified
Fri Apr 06 12:19:41 2012

File modified
File modified
File modified
File modified
File modified
File modified
Fri Apr 06 12:19:41 2012

File modified
File modified
File modified
File modified
File modified
File modified
File modified
Fri Apr 06 12:19:44 2012 


Почему столько записей вида "File modified"?
PM MAIL   Вверх
xvr
Дата 6.4.2012, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(malor @  6.4.2012,  11:34 Найти цитируемый пост)
Почему столько записей вида "File modified"? 

Вы сами просили:
Цитата

                    strncat(sMsg, "File modified", 13);
для справки - strncat добавляет второй аргумент в буфер, на который ссылается первый аргумент. И нигде вы этот буфер не чистите, вот они и накапливаются.

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.

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


 




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


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

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