powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / как отследить изменение каталога в виндосе?
4 сообщений из 4, страница 1 из 1
как отследить изменение каталога в виндосе?
    #32199432
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я знаю, что в виндосе можно отследить, когда мяется содержимое директории.
например, когда пользователь создает новый файл.

т.к. я особо с виндос не работаю, я не представляю, где искать информацию, о том, как работает этот механизм, а также о том, как использовать этот механизм в программе.

господа программисты, дайте соответствующие ссылки пожалуйста.
...
Рейтинг: 0 / 0
как отследить изменение каталога в виндосе?
    #32199563
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В RXLibrary есть такая компонента, ток сам не юзал. Посмотри в исходниках, как она работает.
Я так думаю либо перехватывать виндовые сообщения, либо просто сканить папку через некоторый промежуток времени. Первое предпочтительней...
...
Рейтинг: 0 / 0
как отследить изменение каталога в виндосе?
    #32199735
Фотография Chicago
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
DWORD CListener::Loop()
{
    HANDLE hChanges[ 2 ];
    DWORD dwStatus;
    
    hChanges[ 1 ] = ::CreateEvent(NULL, FALSE, FALSE, _T( "RPServiceExit" ));    
    if(!(hChanges[ 1 ]))
    {
        _Module.LogEvent(_T( "Required event isn't created. Cannot begin listening!"));
        return 0;
    }

    hChanges[0] = ::FindFirstChangeNotification
        (m_szFolder, FALSE, FILE_NOTIFY_CHANGE_ATTRIBUTES);
    if(hChanges[0] == INVALID_HANDLE_VALUE) 
    {
        _Module.LogEvent(_T("Notification isn't started. Cannot begin listening!" ));
        return  1 ;
    }

    _Module.LogEvent(_T( "Listening started" ));
    BOOL bBreak = FALSE;

    while(TRUE)
    {
        _Module.LogEvent(_T( "Waiting for files..." ));
        dwStatus = ::WaitForMultipleObjects( 2 , hChanges, FALSE, INFINITE);

        switch(dwStatus)
        {
        case WAIT_OBJECT_0:
            ScanFolder();
            if(!FindNextChangeNotification(hChanges[ 0 ]))
            {
                _Module.LogEvent(_T( "Cannot continue listening. It will be stopped!" ));
                bBreak = TRUE;
            }
            break;

        case WAIT_OBJECT_0 +  1 :
        default:
            bBreak = TRUE; // Exit worker thread
        }

        if(bBreak) break;
    }
    
    ::FindCloseChangeNotification(hChanges[ 0 ]);
    ::CloseHandle(hChanges[ 1 ]);

    _Module.LogEvent(_T( "Listening stopped" ));
    return  0 ;
}


Тебе нужны функции Win32 API:

FindFirstChangeNotification
FindNextChangeNotification
FindCloseChangeNotification

Первые 2 возвращают handler, который может быть передан в WaitForSingleObject и в WaitForMultipleObjects. Тебе только остается проверить статус и выполнить действия согласно обнаруженным изменениям. Но, как понимаешь, WaitFor... заблокирует текущий поток до момента изменения в файловой системе. Так что вызывать всю эту беду придется из дополнительного worker thread.

P.S. Все это будет работать в NT, 2K и XP. В 9x это не реализовано.
...
Рейтинг: 0 / 0
как отследить изменение каталога в виндосе?
    #32199759
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Chicago
пожоже, то что нужно. Спасибо.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / как отследить изменение каталога в виндосе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]