Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Вниз

необходимо отследить какие файлы были измненены или созданы 


Дмитрий Д.   (2002-01-30 07:20) [0]

Суть задачи такова: запускается мое приложение, которое должно в дальнейшем просто висеть в памяти и вести лог в файл, какие файлы были изменены или созданы во время работы пользователя.
Нужно для каждодневного архивирования работы пользователей.
сейчас приходится сканировать каталоги в начале дня и в конце дня на предмет изменений, это долго.
Может есть способ на лету вести лог, что было изменено или создано .
Заранее спасибо.



MBo   (2002-01-30 13:13) [1]

FindFirstChangeNotification и т.д.
готовый компонент есть в rxlib



Дмитрий Д.   (2002-01-30 15:27) [2]

спасибо за ответ.
но насколько я понял я получу лишь событие на изменение,
а вот как получить какой файл в данной папке был изменен ?



MBo   (2002-01-30 15:46) [3]

а это уже руками.



panov   (2002-01-30 18:20) [4]

Для Windows NT есть функция ReadDirectoryChangesW



Дмитрий Д.   (2002-01-31 13:47) [5]

спасибо.
возникла мысль, а может как то анализировать FAT на предмет изменений до и после работы ?



VuDZ   (2002-01-31 14:15) [6]

если нужен 100% рабочий код - sysinternals.com - FIleMon с исходиками - бушь знать свё с точностью до байта.



drpass   (2002-01-31 14:53) [7]

А тебе именно хочется свою программу написать?
Ведь все это может обеспечить и сама винда, тебе только нужно включить аудит для тех дисков или папок, которые требуется контролировать, и все операции, которые тебя интересуют, будут автоматически заноситься в журнал безопасности винды.



VuDZ   (2002-01-31 15:29) [8]

2drpass - особенно рульно потом многометровый логфайл просматривать :D



panov   (2002-01-31 18:02) [9]

Локальные диски мониторить несложно. А вот эту задачку решить бы для сетевых дисков...



MBo   (2002-01-31 18:09) [10]

>panov ©
у тебя так и не вышло пока для NT/Netware?



Mirovodin   (2002-01-31 20:45) [11]

Думал над этой задачкой в свое время, 2 решения:

1. сканировать все файлы и составлять что то пипа SnapShot т.е. снимков, в них хранить что надо ( название, размер, атрибуты ...)
Реализуемо просто, скорость работы ---> 0.
2. Перехват вызова API функции CreateFile, OpenFile, т.д. По параметрам можно судить о том, что приложение пытается сделать диском. Если процесс который нужно отследить дочерний то все ок, можно его да же запустить как Debug процесс. Но вот если следить нужно за многими процессами (всеми) то это очень сложно реализуемо. Во всяком случае у меня не получилось :)



AlexKniga   (2002-02-01 12:04) [12]

2Дмитрий Д.
Вы сканируете каталоги с помощью FindFirst/FindNext/FindClose?

У самого похожая проблема, пользуюсь FindFirst, но скорость ... :(
Но ведь, есть же быстрые поисковики, например, тот же Найти\файлы и папки. Как он, так шустро, находит измененные файлы?



Дмитрий Д.   (2002-02-01 13:00) [13]

to AlexKniga
да я сканирую рекурсией с помощью FindFirst/FindNext
почему такой способ не совсем подходит:
дело в том что количство файлов для проверки может превышать
180000, а количество каталогов 7000
и сканирование производится на предмет различия в размере и CRC
файлов. Поэтому все это занимает очень много времени, причем именно сбор информации, а не его обработка.
Что касается поисковиков, например в той же винде он используюет индексирование данных в фоновом режиме, и в дальнейшем поиск производится уже по индексу...

to Mirovodin
1. сканировать все файлы и составлять что то пипа SnapShot т.е. снимков, в них хранить что надо ( название, размер, атрибуты ...)
Реализуемо просто, скорость работы ---> 0.

расскажи пожалуста поподробне как можно быстро снимать снэпшоты с фаловой системы.

to panov
Локальные диски мониторить несложно. А вот эту задачку решить бы для сетевых дисков...
Если не очень сложно напиши маленький примерчик для локальных...



Mirovodin   (2002-02-02 00:12) [14]

2 Дмитрий Д.
Список файлов составляется с пом-ю, FindFileFist, FindFileNext - это стандарт WinAPI по другому я не знаю как можно получить список файлов. У каждого файла храним только то что нам нужно ( например имя, размер ) т.к. при огромном кол-ве файлов расход памяти на хранение этого списка не хилый...
Дале сохраняем на диск или оствляем в памяти этот список и через нек-е время делаем снова такую же проц-ру но помещаем информацию в др. список.

НО вот самая проблема - СРАВНИТЬ эти два списка, т.к. это очень, повторяю очень долго . Дольше чем процесс сканирования в 2-3 раза(проверено только для создания удаления новых файлов, а если сверять контрольную сумму то это вообще ...). Применял хешированные списки и т.д. В принципе кому интересно посмотрите прогу
Professional UnInstaller http://www.hcsoft.spb.ru



Mirovodin   (2002-02-02 00:17) [15]

Да в дагонку, на счет сетевых - это все так же реализуемо методом поиска фалов. Просто нужно установить полный доступ к диску. На счет скорости сканирования - очень низкая на 10 MBit + не кислый трафик :)



Дмитрий Д.   (2002-02-04 09:20) [16]

to Mirovodin
спасибо за ответ.
сразу скажу что время сбора информации у меня получается гораздо больше чем анализ (сравнение) этих двух списков, я просто придумал кривенький :) , но рабочий и достато быстрый алгоритм для сравнения списков, и основная затыка по времени со сбором инфы (я писал выше какие объемы приходится сканировать).
Можно канечно остановиться на анализе каталогов в которых произошли изменения, не учитывая сами измененные файлы (потому как не знаю как это сделать), но это все равно работа по схеме сравнения двух списков, причем формирование первого списка файлов все равно придется делать...

В идеале я думал построить такую систему, при которой архивация производилась бы только тех файлов, которые изменялись (или переписывались) или были созданы. Тогда бы все было быстро.
Если у кого-то есть какие то идеи, буду очень признателен.
Заранее спасибо.



AlexKniga   (2002-02-04 12:23) [17]

2Дмитрий Д.
<<индексирование данных в фоновом режиме>>
Сомневаюсь. Так как, принес на работу домашний винт и выполнил поиск сразу после загрузки Винды. Нашел довольно шустро. При этом "Быстрый поиск ..." из Автозагрузки выкинут. Вообще я особого влияния от "Быстрый поиск ..." не ощущаю.




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.019 c
3-9357            ruslan_as             2002-03-11 13:41  2002.04.04  
DBLookupComboBox


3-9369            Dil                   2002-03-10 22:02  2002.04.04  
Вопрос про редактирование в БД Access.


6-9588            KPOT                  2002-01-22 14:06  2002.04.04  
Sockety


3-9382            kserg@ukr.net         2002-03-11 10:28  2002.04.04  
Вопрос по Модулю Данных:


1-9550            Atrem                 2002-03-23 12:38  2002.04.04  
Мастера,как можно перебрать в цикле все узлы и всех потомков всех узлов и т.д. в TTreeView?