Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / как отследить изменение каталога в виндосе? / 4 сообщений из 4, страница 1 из 1
04.07.2003, 11:41
    #32199432
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как отследить изменение каталога в виндосе?
я знаю, что в виндосе можно отследить, когда мяется содержимое директории.
например, когда пользователь создает новый файл.

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

господа программисты, дайте соответствующие ссылки пожалуйста.
...
Рейтинг: 0 / 0
04.07.2003, 12:49
    #32199563
Даниил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как отследить изменение каталога в виндосе?
В RXLibrary есть такая компонента, ток сам не юзал. Посмотри в исходниках, как она работает.
Я так думаю либо перехватывать виндовые сообщения, либо просто сканить папку через некоторый промежуток времени. Первое предпочтительней...
...
Рейтинг: 0 / 0
04.07.2003, 14:28
    #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
04.07.2003, 14:43
    #32199759
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как отследить изменение каталога в виндосе?
2 Chicago
пожоже, то что нужно. Спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / как отследить изменение каталога в виндосе? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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