Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];

Вниз

Нужен алгоритм   Найти похожие ветки 

 
panov   (2002-01-14 07:17) [0]

Предложите алгоритм.
Задача:
Есть сетевой диск. Необходимо на нем сканировать каталог для определения изменений файлов в нем.
Изменения могут быть такие:
1. Добавление файла.
2. Удаление файла.
3. Переименование файла.
4. Изменение атрибутов файла.

Прошу высказать мысли по этому поводу.


 
MBo   (2002-01-14 07:49) [1]

RxFolderMonitor все это умеет


 
panov   (2002-01-14 08:01) [2]

Не надо RxFolderMonitor. Нужен алгоритм.


 
MBo   (2002-01-14 08:14) [3]

так в его исходниках все есть - создается
NotifyThread, отслеживающая FindFirstChangeNotification
WaitForMultipleObjects
и иже с ними



 
panov   (2002-01-14 08:27) [4]

>MBo © (14.01.02 08:14)
FindFirstChangeNotification не работает для сетевых дисков.


 
MBo   (2002-01-14 08:39) [5]

проверял - RXFold. работает для MS-сети и NetWare (Win98)
да и в SDK не увидел упоминания о сетевых дисках


 
panov   (2002-01-14 09:30) [6]

Я тоже только что специально установил RX 2.75.
При попытке перевести объект RXFolderMonitor в сотояние Active

Выдается ошибка:
Win32 Error. Code: 50.
Запрос сети не поддерживается.

Так что, извиняйте. Информация, мягко говоря - не верна.


 
MBo   (2002-01-14 09:42) [7]

А Windows какие?
У меня же все работает.


 
panov   (2002-01-14 09:51) [8]

NT, сетевой диск на Novell.


 
panov   (2002-01-14 09:55) [9]

Если хочешь, могу прислать свой пример с FindFirstChangeNotify/FindNextChangeNotify.
Он с сетевыми дисками не работает. Но с локальными прекрасно.
Попробуй у себя.

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


 
Алексей Петров   (2002-01-14 10:06) [10]

> panov © (14.01.02 09:51)
> NT, сетевой диск на Novell.
То-то и оно, что Novell. На диске виндового сервера - эти функции работают



 
Polevi   (2002-01-14 10:09) [11]

Создаешь в проверяемой папке скрытый файл, в котором хранишь информацию об остальных файлах в папке. Далее сканируешь папку и сравниваешь ее состояние с данными в твоем файле и обновляешь свой файл.


 
panov   (2002-01-14 10:27) [12]

>Polevi © (14.01.02 10:09)
"сравниваешь ее состояние "
- переименовани файл - как это определить?

Задачка не такая простая, как кажется...


 
andy_ar   (2002-01-14 10:32) [13]

Ну, думаю, что придется вести базу по файлам...
Если на сервере - NT, то все решается аудитом...


 
panov   (2002-01-14 10:32) [14]

>Алексей Петров © (14.01.02 10:06)
Если сетевой диск на Win9x, то тоже не работает...
На сервере NT проверить нет возможности...


 
panov   (2002-01-14 10:33) [15]

>andy_ar © (14.01.02 10:32)
Нужен не аудит.
Сканируется диск, и при изменении содежимого каталога программа реагирует на это.


 
andy_ar   (2002-01-14 10:38) [16]

А разве нельзя сканировать не содержимое каталога, а файл аудита?


 
Алексей Петров   (2002-01-14 10:39) [17]

Я проверял только на сетевом диске с NTFS. Там ReadDirectoryChangesW работал. Моя машина - тоже NT-шка.


 
Andrey   (2002-01-14 10:42) [18]

> panov
"переименовани файл - как это определить" - может быть какая-нибудь контрольная сумма? Хотя тогда (наверно) нужно весь файл тянуть к себе и если файл слегка изменился то тогда можно говорить только о схожести файлов.


 
panov   (2002-01-14 10:46) [19]

>andy_ar © (14.01.02 10:38)
А как быть с Novell, да и Win9x?
А есть еще Samba на unix...
---------------------

Как мне кажется, единственные работающие команды в любой операционной системе - FindFirst/FindNext.

Вот для них-то и нужно построить алгоритм.
Возможные грабли:
1. Добавление файла.
Возможно файл был удален, но на его место был записан новый с таким же именем.
2. Переименование.
При переименовании, возможно будет детектироваться удалене+добавление файла.


 
panov   (2002-01-14 10:47) [20]

>Andrey © (14.01.02 10:42)
При переименовании я вижу только один выход - проверять все атрибуты(в том числе и размер). Но это не дает 100% гарантии.


 
Romkin   (2002-01-14 11:05) [21]

И ничто не даст, это просто нельзя распознать, не влезая в дебри файловой структуры и не используя notification. Почему бы не остановиться именно на FindFirstChangeNotification? Если сервер NT - работает отовсюду, проверить очень легко - открываешь каталог в эксплорере, а потом с другой станции (или даже с этой) работаешь с ним. Если прежде открытое окно отреагировало - FindFirstChangeNotification работает.
Дело в том, что можно определить элементарные операции с файлами - создание файла/удаление файла. Тогда копирование определяется как создание такого же файла (с другим именем), переименование - копирование + удаление. Именно поэтому определить, что именно произошло, просто так нельзя. Можно, конечно, пытаться по таймеру открывать файл на исключительное использование, тогда если что-то делается с файлом, то будет ошибка, но опять же никакой гарантии.


 
panov   (2002-01-14 11:15) [22]

С большой уверенностью можно сказать, что такой атрибут файла, как TimeStamp у разных файлов различный, поэтому если проверять время изменения+размер файла+имя+атрибуты, то почти на 100% можно определить, что произошло.
Проблемная ситуация возникает с большим количеством файлов.
В этом случае сканирование такого каталога будет достаточно ресурсоемким.



 
MBo   (2002-01-14 13:55) [23]

проверил RXFold. на Win2K - не работает, так что дело в NT



Страницы: 1 вся ветка

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

Наверх





Память: 0.62 MB
Время: 0.034 c
1-90612
Dinara
2002-02-12 23:02
2002.02.28
ListView


3-90478
Garmahis
2002-01-30 20:00
2002.02.28
Оператор UPDATE в SQL


14-90669
Diana
2002-01-10 09:17
2002.02.28
Хранение информации


4-90720
a-leksey
2001-12-26 20:06
2002.02.28
Вопрос о Хуках! А именно о WH_JOURNALPLAYBACK!!!


3-90515
СергейМНК
2002-02-04 06:15
2002.02.28
Как сделать чтобы выскакивал LoockUp список при начале набора текста в DBGrid в LoockUp поле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский