Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2008, 14:02   #1
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию Мониторинг каталога. Снимок папки.

Делаю мониторинг каталога на предмет изменений с помощью FindFirsChangeNotification. Мне необходимо вытягивать имя папки или файла, который изменился. Как вариант - это делать снимок структуры папки и сравнивать этот снимок после изменения для выявления этих файлов и папок.
Как этот снимок можно сделать?
zhefran вне форума Ответить с цитированием
Старый 26.09.2008, 15:44   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

А зачем? Есть куча готовых компонентов (например, abfFolderMonitor), которые мониторят каталоги на изменение для размера или имени файлов, изменение атрибутов, измнение имени каталога и т.д и готовое событие OnChange. Работают быстро. Проверял.
_SERGEYX_ вне форума Ответить с цитированием
Старый 26.09.2008, 15:58   #3
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

Посмотрел, я тот компонент. Там все равно не вытянешь имя файла или папки! Я не нашел.
zhefran вне форума Ответить с цитированием
Старый 26.09.2008, 16:11   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Если надо проверить изменения папки через несколько дней, надо эту папку сканировать FindFirst/FindNext и сохранить в файл информацию. Затем уже проверять.
Код:
procedure TForm1.Button12Click(Sender: TObject);
var
  mas: array of TSearchRec;
procedure ScanDir(StartDir: string);
var
  SearchRec: TSearchRec;
  k: integer;
begin
  if StartDir[Length(StartDir)] <> '\' then
    StartDir := StartDir + '\';
  k := 0;
  if FindFirst(StartDir + '*', faAnyFile, SearchRec) = 0 then
  repeat 
     if (SearchRec.Name<>'..')and(SearchRec.Name<>'.') then
     begin
     inc(k);
     setlength(mas, k);
     mas[k-1] := SearchRec
     end
  until FindNext(SearchRec) <> 0;
  FindClose(SearchRec)
end;
begin
  ScanDir('путь к папке')
  //затем сохраняем массив mas в файл 
end;
Добавлю, что иногда может меняться пару байт, а атрибуты нет, в этом случае к каждому файлу надо вычислять CRC например

Последний раз редактировалось eoln; 26.09.2008 в 16:13.
eoln вне форума Ответить с цитированием
Старый 26.09.2008, 20:46   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот компонент:
Вложение 5812
Описание
Цитата:
Компонент является оболочкой функций Win32 API, позволяющих отслеживать изменения в файловой системе. Работает в отдельном потоке.
Имеет всего два свойства: Active и DirToWatch.
Первое служит для включения/выключения слежки за изменениями, второе - для указания директории за которой нужно следить.
Имеет события:
OnChangeFileName
OnChangeDirName
OnChangeAttributes
OnChangeSize
OnChangeLastWrite
Если вы и с ним не справитесь, то извините - кривизну рук на расстоянии вылечить нереально...

Последний раз редактировалось mihali4; 08.11.2008 в 14:04.
mihali4 вне форума Ответить с цитированием
Старый 27.09.2008, 04:42   #6
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

OFF
Цитата:
то извините - кривизну рук на расстоянии вылечить нереально...
Почему? всё реально:
Например, можно дать совет, как их правильно направить в шель между забором
Ring0Sn вне форума Ответить с цитированием
Старый 29.09.2008, 13:58   #7
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

mihali4, при использовании компонента TDirInspector нужно все равно пользоваться тем, что предложил eoln. В свойствах предложеного компонента нету такого, которое бы отвечало за имя файла или папки, который/каторая изменялась.
zhefran вне форума Ответить с цитированием
Старый 29.09.2008, 20:11   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
В свойствах предложеного компонента нету такого, которое бы отвечало за имя файла или папки, который/каторая изменялась
А посмотреть код компонента? А поколдовать над ним малость?
Или все на чужого дядю будете надеяться?
mihali4 вне форума Ответить с цитированием
Старый 30.09.2008, 16:14   #9
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

mihali4, мониторинг реализован в этом компоненте с помощью функции FindFirstChangeNotification/FindNextChangeNotification, а в этих функциях отследить имя изменяемого обьекта я не нашел как.
zhefran вне форума Ответить с цитированием
Старый 30.09.2008, 16:29   #10
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
отследить имя изменяемого обьекта я не нашел как.
А если сортировать файлы не по имени, а по дате/времени последнего изменения? Что касается изменения имени самого каталога..., хм, а почему бы в сам код проверки не вставить if not directoryexists(...)?
_SERGEYX_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать снимок экрана? Briz Общие вопросы Delphi 28 10.04.2013 16:29
Как сделать снимок экрана в графическом режиме? Борис2 Паскаль, Turbo Pascal, PascalABC.NET 9 08.12.2007 21:07
Мониторинг реестра AidarBik Безопасность, Шифрование 4 30.09.2007 15:31
Отслеживает появление в папке файлов. слежение за определенным файлом в определенной папке. RammFan Win Api 1 09.06.2007 11:09
Снимок экрана Viteef Общие вопросы Delphi 9 16.05.2007 20:12