Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Отловить появление файла..


Автор: -Sman- 29.3.2004, 11:37
Здравствуйте!
Вот такая вот задачка есть - на машину сбрасывается файл (по сети или ftp), необходимо написать программку которая висела бы и отлавливала появление этого файла в конкретной папке..
Подскажите пожалуйста, что делать? В какую сторону рыть-то? Есть мнение - что смотреть надо в сторону хуков..Вот еще хотелось бы узнать как с ними работать в этом направлении rolleyes.gif
Пасиб заранее.. wink.gif

Автор: Abrek 29.3.2004, 16:00
Если директория фиксирована, то можно сделать таимер и на его события опрашивать FileExists

Автор: Mephisto 29.3.2004, 17:47
Цитата
Если директория фиксирована, то можно сделать таимер и на его события опрашивать FileExists

Если оперативу не жалко!

Автор: mr.DUDA 29.3.2004, 21:29
апи-хук поставить на WinAPI'шный CreateFile, его все юзают...

Автор: Royan 30.3.2004, 13:40
Если твоя машина стоит на винде (>2000) можно воспользоваться аудитом, пойди на msdn, и набери в поиске что-то вроде About Authorization, Access Control, Audit Generation. Наверняка вывалится то что нужно.

Автор: p0s0l 30.3.2004, 15:53
-Sman-, делал я такую вещь, правда на Delphi. В Cи не особо, так что извиняй, если что не так напишу...
Принцип простой (но надо 2k/XP...):
1. Открываешь директорию для просмотра:
hDir = CreateFile("C:\\1", FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
2. Создаешь событие для прослеживания изменений директории:
hNotify = FindFirstChangeNotification("c:\\1", FALSE, FILE_NOTIFY_CHANGE_FILE_NAME);
3. Цикл отслеживания:
3.1 Ожидаешь событие изменения:
WaitForSingleObject(hNotify, INFINITE);
3.2 Получаешь список изменений в директории:
ReadDirectoryChangesW(hDir, Buf, BufSize, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME, &Returned, NULL, NULL);
3.3 В Buf теперь список структур FILE_NOTIFY_INFORMATION, их просматриваешь, и если поле Action == FILE_ACTION_ADDED, то добавили файл, его имя в поле FileName.
3.4 Ожидаешь следующее изменение:
FindNextChangeNotification(hNotify); -> 3.1
4. FindCloseChangeNotification(hNotify);
5. CloseHandle(hDir);

PS: Можно обойтись и без FindFirstChangeNotification/FindNextChangeNotification, просто время от времения делая ReadDirectoryChangesW, но это будет менее экономично в смысле процессорного времени...

Автор: p0s0l 31.3.2004, 06:26
Не слушай меняsmile.gif
Я как всегда всё усложнил hehe.gif , можно обойтись ReadDirectoryChangesW - он сам ждет появление файла, не надо всяких WaitFor*Object...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)