Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Отследить время изменения файла


Автор: Штабс 30.11.2004, 10:51
Собственно задача ясна из названия темы
есть файл...
smile
и требуется отследить время его последней модификации

прошу только не предлагать
алгоритмы типа
скопировать в новый
стереть старый
переиминовать


файл меняет ДРУГОЕ ( не мое ) приложение

и вообще возможно ли это?

Автор: unreg 30.11.2004, 11:27
Код

var stop:boolean = false;
.............

procedure TForm1.Button1Click(Sender: TObject);
var Notifi:THandle;
begin
 Notifi:=FindFirstChangeNotification('C:\',false,FILE_NOTIFY_CHANGE_LAST_WRITE);
 While stop<>true do
 begin
   if WaitForSingleObject(ChNnf,0)=WAIT_OBJECT_0 then
       Caption:='Файл изменился '+DateTimeToStr(Now);  
   FindNextChangeNotification(Notifi);
   Application.ProcessMessages;
 end;
 FindCloseChangeNotification(Notifi);
end;

Автор: Jureth 30.11.2004, 13:46
Сий алгоритм, ИМХО, лучше запускать в отдельном потоке.

А вообще в D7 уже есть компонент, выполняющий эти действия, но он, ИМХО, немного глючный (в смысле - пропускает иногда события). Называется - ShellChangeNotifier на вкладке Samples

Автор: Штабс 30.11.2004, 15:24
так метод с потоками реализовал...
все ОК

А вот с ShellChangeNotifier
затык
найти то нашел
а вот юзать не могу
если быть честным то не умею
поможете?

Автор: Штабс 30.11.2004, 15:54
кстати уважаемый UNREG

в вашем коде
или ошибка или я не понимаю

WaitForSingleObject(ChNnf,0)=WAIT_OBJECT_0 then


так что же это такое ChNnf?

Автор: Girder 30.11.2004, 16:51
Для потока smile
Код
procedure Твой поток.Execute;
var FNotifier: THandle;
      FRoot: String;
begin
FRoot:='C:\';
FNotifier:=FindFirstChangeNotification(PChar(FRoot),false,File_Notify_Change_Last_Write);
Win32Check(FNotifier<>Invalid_Handle_Value);
try
 while not(Terminated) do
  begin
   case WaitForSingleObject(FNotifier,Infinite) of
    Wait_Failed:Terminate;
    Wait_Object_0:Synchronize(UpdateLog);
   end;
   FindNextChangeNotification(FNotifier);
  end;
finally
 FindCloseChangeNotification(FNotifier);
end;
end;

procedure Твой поток.UpdateLog;
begin
Form1.Caption:='Что-то в данной дирректории изменилось!';
end;


Удачи.

Автор: Guest 30.11.2004, 17:17
smile
Я так и думал...кстати мой поток аналогичен Вашему, г-н Grider...
вопрос задавался для очистки совести...
я увы ведь не могу все знать... smile

так теперь остался вопрос с Shelom smile

Автор: unreg 1.12.2004, 08:22
Уважаемы Guest, по поводу:

WaitForSingleObject(ChNnf,0)=WAIT_OBJECT_0 then


так что же это такое ChNnf?

Поясняю. Этот кусок я выдернул из своего кода. Для придания ему более понятного вида, я выкинул из него все не относящееся к вопросу и заменил ChNnf на Notifi. В этой строке, я, элементарно, пропустил замену (такое бывает). Интересно, чтобы вы делали прочитав ответ на свой вопрос в DRKB? Вы вообще его читали?

Jureth Можно и в отдельном, а можно и нет. Если второй параметр в WaitForSingleObject равен 0, то функция возвращает значение немедленно, какое бы оно нибыло. Для недолгих операций очень даже можно пользоваться, и не надо следить за потоками.

Автор: Guest 1.12.2004, 09:55
Уважаемы Guest, по поводу:

WaitForSingleObject(ChNnf,0)=WAIT_OBJECT_0 then


так что же это такое ChNnf?

Поясняю. Этот кусок я выдернул из своего кода. Для придания ему более понятного вида, я выкинул из него все не относящееся к вопросу и заменил ChNnf на Notifi. В этой строке, я, элементарно, пропустил замену (такое бывает).



Добрый день UNREG
кстати сегодня первый календарный день зимы

объясняю свой вопрос...
по тексту было понятно что вместо ChNnf надо было ставить определенный ранее Notifi....
что я и сделал
но осталось сомнение, что ChNnf определенная системная структура...типа Chenge_Notifaction...сокращенное до ChNnf...и опсианный в каком нибудь модуле...
так как BP7 ругается значит я его не подсоединил....или его нет?

поэтому я переделал на Notifi...проверил работает или нет...
и НАВСЯКИЙ случай закинул вопрос
уф... smile


Интересно, чтобы вы делали прочитав ответ на свой вопрос в DRKB? Вы вообще его читали?
Опля!
Нет не читал...где это?

Jureth Можно и в отдельном, а можно и нет. Если второй параметр в WaitForSingleObject равен 0, то функция возвращает значение немедленно, какое бы оно нибыло. Для недолгих операций очень даже можно пользоваться, и не надо следить за потоками.
Всем. Сделано и так и так. Не парьтесь как лучше

Автор: unreg 1.12.2004, 13:05
Да, всех с первым днем зимы. DRKB - фак этого (и не только) форума . спасибо Vit-у, и тем кто ему помогал. Очень качественная и полезная вещь. Посмотрите в важных темах, там есть ссылка для скачивания.

Автор: Guest 1.12.2004, 17:11
Уважаемый UNREG
DRKB скачал.
Вешь и впрямь полезная...я бы даже сказал настольная.
но Вас я не нашел...
подскажите где вы?
PS не хочется пошлить...
но вызывает улыбку
чуть не написал DRKPB smile
по аналогии с ВРКПБ

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