Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: CL | DM;

Вниз

Определить что изменился файл? Во всей Файловой системе?   Найти похожие ветки 

 
Arazel ©   (2005-12-24 12:59) [0]

Как узнать что файлизменился под определеннным расширением
во всей системе например DOC...


 
Anatoly Podgoretsky ©   (2005-12-24 13:22) [1]

FindFirstChangeNotification


 
begin...end ©   (2005-12-24 13:26) [2]

Не FindFirstChangeNotification, а ReadDirectoryChangesW, и только для NT-систем.


 
VirEx ©   (2005-12-24 14:13) [3]

жаль еще в кладовке не проверены исходники которые я выложил, ладно приведу пример здесь:
unit wfsU;

interface

type
// Структура с информацией об изменении в файловой системе (передается в callback процедуру)

 PInfoCallBack = ^TInfoCallBack;
 TInfoCallBack = record
   FAction      : Integer; // тип изменения (константы FILE_ACTION_XXX)
   FDrive       : string;  // диск, на котором было изменение
   FOldFileName : string;  // имя файла до переименования
   FNewFileName : string;  // имя файла после переименования
 end;

 // callback процедура, вызываемая при изменении в файловой системе
 TWatchFileSystemCallBack = procedure (pInfo: TInfoCallBack);

{ Запуск мониторинга файловой системы
 Праметры:
 pName    - имя папки для мониторинга
 pFilter  - комбинация констант FILE_NOTIFY_XXX
 pSubTree - мониторить ли все подпапки заданной папки
 pInfoCallBack - адрес callback процедуры, вызываемой при изменении в файловой системе}
procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallBack: TWatchFileSystemCallBack);
// Остановка мониторинга
procedure StopWatch;

implementation

uses
 Classes, Windows, SysUtils;

const
 FILE_LIST_DIRECTORY   = $0001;

type
 PFileNotifyInformation = ^TFileNotifyInformation;
 TFileNotifyInformation = record
   NextEntryOffset : DWORD;
   Action          : DWORD;
   FileNameLength  : DWORD;
   FileName        : array[0..0] of WideChar;
 end;

 WFSError = class(Exception);

 TWFS = class(TThread)
 private
   FName           : string;
   FFilter         : Cardinal;
   FSubTree        : boolean;
   FInfoCallBack   : TWatchFileSystemCallBack;
   FWatchHandle    : THandle;
   FWatchBuf       : array[0..4096] of Byte;
   FOverLapp       : TOverlapped;
   FPOverLapp      : POverlapped;
   FBytesWritte    : DWORD;
   FCompletionPort : THandle;
   FNumBytes       : Cardinal;
   FOldFileName    : string;
   function CreateDirHandle(aDir: string): THandle;
   procedure WatchEvent;
   procedure HandleEvent;
 protected
   procedure Execute; override;
 public
   constructor Create(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallBack: TWatchFileSystemCallBack);
   destructor Destroy; override;
 end;

var
 WFS : TWFS;

procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallBack: TWatchFileSystemCallBack);
begin
WFS:=TWFS.Create(pName, pFilter, pSubTree, pInfoCallBack);
end;

procedure StopWatch;
var
 Temp : TWFS;
begin
 if Assigned(WFS) then
 begin
  PostQueuedCompletionStatus(WFS.FCompletionPort, 0, 0, nil);
  Temp := WFS;
  WFS:=nil;
  Temp.Terminate;
 end;
end;

constructor TWFS.Create(pName: string; pFilter: cardinal;
 pSubTree: boolean; pInfoCallBack: TWatchFileSystemCallBack);
begin
 inherited Create(True);
 FreeOnTerminate:=True;
 FName:=IncludeTrailingBackslash(pName);
 FFilter:=pFilter;
 FSubTree:=pSubTree;
 FOldFileName:=EmptyStr;
 ZeroMemory(@FOverLapp, SizeOf(TOverLapped));
 FPOverLapp:=@FOverLapp;
 ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
 FInfoCallBack:=pInfoCallBack;
 Resume
end;

destructor TWFS.Destroy;
begin
 PostQueuedCompletionStatus(FCompletionPort, 0, 0, nil);
 CloseHandle(FWatchHandle);
 FWatchHandle:=0;
 CloseHandle(FCompletionPort);
 FCompletionPort:=0;
 inherited Destroy;
end;

function TWFS.CreateDirHandle(aDir: string): THandle;
begin
Result:=CreateFile(PChar(aDir), FILE_LIST_DIRECTORY, FILE_SHARE_READ+FILE_SHARE_DELETE+FILE_SHARE_WRITE,
                  nil,OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0);
end;

procedure TWFS.Execute;
begin
 FWatchHandle:=CreateDirHandle(FName);
 WatchEvent;
end;

procedure TWFS.HandleEvent;
var
 FileNotifyInfo : PFileNotifyInformation;
 InfoCallBack   : TInfoCallBack;
 Offset         : Longint;
begin
 Pointer(FileNotifyInfo) := @FWatchBuf[0];
 repeat
   Offset:=FileNotifyInfo^.NextEntryOffset;
   InfoCallBack.FAction:=FileNotifyInfo^.Action;
   InfoCallBack.FDrive:=FName;
   SetString(InfoCallBack.FNewFileName,FileNotifyInfo^.FileName,
             FileNotifyInfo^.FileNameLength );
   InfoCallBack.FNewFileName:=Trim(InfoCallBack.FNewFileName);
   case FileNotifyInfo^.Action of
     FILE_ACTION_RENAMED_OLD_NAME: FOldFileName:=Trim(WideCharToString(@(FileNotifyInfo^.FileName[0])));
     FILE_ACTION_RENAMED_NEW_NAME: InfoCallBack.FOldFileName:=FOldFileName;
   end;

   FInfoCallBack(InfoCallBack);
   PChar(FileNotifyInfo):=PChar(FileNotifyInfo)+Offset;
 until (Offset=0) or Terminated;
end;

procedure TWFS.WatchEvent;
var
CompletionKey: Cardinal;
begin
 FCompletionPort:=CreateIoCompletionPort(FWatchHandle, 0, Longint(pointer(self)), 0);
 ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
 if not ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree,
   FFilter, @FBytesWritte,  @FOverLapp, 0) then
 begin
   raise WFSError.Create(SysErrorMessage(GetLastError));
   Terminate;
 end else
 begin
   while not Terminated do
   begin
     GetQueuedCompletionStatus(FCompletionPort, FNumBytes, CompletionKey, FPOverLapp, INFINITE);
     if CompletionKey<>0 then
     begin
       Synchronize(HandleEvent);
       ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
       FBytesWritte:=0;
       ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree, FFilter,
                            @FBytesWritte, @FOverLapp, 0);
     end else Terminate;
   end
 end
end;

end.


 
VirEx ©   (2005-12-24 14:15) [4]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs,wfsU, StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Button1: TButton;
   Button2: TButton;
   Edit1: TEdit;
   Label1: TLabel;
   CheckBox1: TCheckBox;
   CheckBox2: TCheckBox;
   CheckBox3: TCheckBox;
   CheckBox4: TCheckBox;
   CheckBox5: TCheckBox;
   CheckBox6: TCheckBox;
   CheckBox7: TCheckBox;
   CheckBox8: TCheckBox;
   CheckBox9: TCheckBox;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
procedure MyInfoCallBack(pInfo: TInfoCallBack);
 const
   Action: array[1..3] of String = ("Создание: %s", "Удаление: %s", "Изменение: %s");
 begin

   case pInfo.FAction of
     FILE_ACTION_RENAMED_NEW_NAME: Form1.Memo1.Lines.Add(Format("Переименование: %s в %s",
         [pInfo.FDrive+pInfo.FOldFileName,pInfo.FDrive+pInfo.FNewFileName]));
   else
     if pInfo.FAction<FILE_ACTION_RENAMED_OLD_NAME then
       Form1.Memo1.Lines.Add(Format(Action[pInfo.Faction], [pInfo.FDrive+pInfo.FNewFileName]));
   end;
{
  case pInfo.FAction of
FILE_NOTIFY_CHANGE_FILE_NAME:Form1.Memo1.Lines.Add("FILE_NOTIFY_CHANGE_FILE_NAME");
FILE_NOTIFY_CHANGE_DIR_NAME:Form1.Memo1.Lines.Add("FILE_NOTIFY_CHANGE_DIR_NAME");
FILE_NOTIFY_CHANGE_ATTRIBUTES:Form1.Memo1.Lines.Add("FILE_NOTIFY_CHANGE_ATTRIBUTES");
FILE_NOTIFY_CHANGE_SIZE:Form1.Memo1.Lines.Add("FILE_NOTIFY_CHANGE_SIZE");
FILE_NOTIFY_CHANGE_LAST_WRITE:Form1.Memo1.Lines.Add("FILE_NOTIFY_CHANGE_LAST_WRITE");
FILE_NOTIFY_CHANGE_LAST_ACCESS:Form1.Memo1.Lines.Add("FILE_NOTIFY_CHANGE_LAST_ACCESS");
FILE_NOTIFY_CHANGE_CREATION:Form1.Memo1.Lines.Add("FILE_NOTIFY_CHANGE_CREATION");
FILE_NOTIFY_CHANGE_SECURITY:Form1.Memo1.Lines.Add("FILE_NOTIFY_CHANGE_SECURITY");
  end;}
 end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Flags:Cardinal;
begin
{
FILE_NOTIFY_CHANGE_FILE_NAME        = $00000001;//изменение имени файла
FILE_NOTIFY_CHANGE_DIR_NAME         = $00000002;//изм. имени папки
FILE_NOTIFY_CHANGE_ATTRIBUTES       = $00000004;//атрибутов файла
FILE_NOTIFY_CHANGE_SIZE             = $00000008;//размера
FILE_NOTIFY_CHANGE_LAST_WRITE       = $00000010;//последней записи
FILE_NOTIFY_CHANGE_LAST_ACCESS      = $00000020;//последнего доступа
FILE_NOTIFY_CHANGE_CREATION         = $00000040;//создания
FILE_NOTIFY_CHANGE_SECURITY         = $00000100;//прав доступа
}
Flags:=0;
if CheckBox2.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_FILE_NAME;
if CheckBox3.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_DIR_NAME;
if CheckBox4.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_ATTRIBUTES;
if CheckBox5.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_SIZE;
if CheckBox6.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_LAST_WRITE;
if CheckBox7.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_LAST_ACCESS;
if CheckBox8.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_CREATION;
if CheckBox9.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_SECURITY;

                                                                                                                                                                                                                                                                            //включая подкаталоги
StartWatch(Edit1.Text, Flags, CheckBox1.Checked, @MyInfoCallBack);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
StopWatch;
end;

end.


 
VirEx ©   (2005-12-24 14:16) [5]

и файл Unit1.dfm:
object Form1: TForm1
 Left = 192
 Top = 107
 Width = 385
 Height = 343
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Label1: TLabel
   Left = 8
   Top = 168
   Width = 196
   Height = 13
   Caption = #1055#1091#1090#1100" "#1082" "#1087#1072#1087#1082#1077" "#1080#1083#1080" "#1076#1080#1089#1082#1091" "#1076#1083#1103" "#1089#1083#1077#1078#1077#1085#1080#1103":"
 end
 object Memo1: TMemo
   Left = 0
   Top = 0
   Width = 377
   Height = 161
   Align = alTop
   ScrollBars = ssBoth
   TabOrder = 0
 end
 object Button1: TButton
   Left = 8
   Top = 232
   Width = 75
   Height = 25
   Caption = "start"
   TabOrder = 1
   OnClick = Button1Click
 end
 object Button2: TButton
   Left = 96
   Top = 232
   Width = 75
   Height = 25
   Caption = "stop"
   TabOrder = 2
   OnClick = Button2Click
 end
 object Edit1: TEdit
   Left = 8
   Top = 184
   Width = 201
   Height = 21
   TabOrder = 3
   Text = "C:\"
 end
 object CheckBox1: TCheckBox
   Left = 8
   Top = 208
   Width = 153
   Height = 17
   Caption = #1042#1082#1083#1102#1095#1072#1103" "#1087#1086#1076#1082#1072#1090#1072#1083#1086#1075#1080
   Checked = True
   State = cbChecked
   TabOrder = 4
 end
 object CheckBox2: TCheckBox
   Left = 224
   Top = 176
   Width = 150
   Height = 17
   Caption = #1080#1084#1077#1085#1080" "#1092#1072#1081#1083#1072
   Checked = True
   State = cbChecked
   TabOrder = 5
 end
 object CheckBox3: TCheckBox
   Left = 224
   Top = 192
   Width = 150
   Height = 17
   Caption = #1080#1084#1077#1085#1080" "#1087#1072#1087#1082#1080
   Checked = True
   State = cbChecked
   TabOrder = 6
 end
 object CheckBox4: TCheckBox
   Left = 224
   Top = 208
   Width = 150
   Height = 17
   Caption = #1072#1090#1088#1080#1073#1091#1090#1086#1074" "#1092#1072#1081#1083#1072
   Checked = True
   State = cbChecked
   TabOrder = 7
 end
 object CheckBox5: TCheckBox
   Left = 224
   Top = 224
   Width = 150
   Height = 17
   Caption = #1088#1072#1079#1084#1077#1088#1072
   Checked = True
   State = cbChecked
   TabOrder = 8
 end
 object CheckBox6: TCheckBox
   Left = 224
   Top = 240
   Width = 150
   Height = 17
   Caption = #1087#1086#1089#1083#1077#1076#1085#1077#1081" "#1079#1072#1087#1080#1089#1080
   Checked = True
   State = cbChecked
   TabOrder = 9
 end
 object CheckBox7: TCheckBox
   Left = 224
   Top = 256
   Width = 150
   Height = 17
   Caption = #1087#1086#1089#1083#1077#1076#1085#1077#1075#1086" "#1076#1086#1089#1090#1091#1087#1072
   Checked = True
   State = cbChecked
   TabOrder = 10
 end
 object CheckBox8: TCheckBox
   Left = 224
   Top = 272
   Width = 150
   Height = 17
   Caption = #1089#1086#1079#1076#1072#1085#1080#1103
   Checked = True
   State = cbChecked
   TabOrder = 11
 end
 object CheckBox9: TCheckBox
   Left = 224
   Top = 288
   Width = 150
   Height = 17
   Caption = #1087#1088#1072#1074" "#1076#1086#1089#1090#1091#1087#1072
   Checked = True
   State = cbChecked
   TabOrder = 12
 end
end


 
Arazel ©   (2005-12-24 20:00) [6]

VirEx ©
Два  вопроса:
1) Будет ли это работать под Win9x?
2) Как  сделать что  бы он определял по  расширению?


 
VirEx ©   (2005-12-24 20:08) [7]


> 1) Будет ли это работать под Win9x?


> нет, ReadDirectoryChangesW только для NT-систем.


> 2) Как  сделать что  бы он определял по  расширению?

вот в procedure MyInfoCallBack(pInfo: TInfoCallBack); и смотри расширение нужное именно тебе


 
Arazel ©   (2005-12-24 20:58) [8]

VirEx  Спасибо! Снаступающим новым 2006  годом ;)
А ты  незнаеш анналоги ф-ций  ReadDirectoryChangesW для Win9x?


 
VirEx ©   (2005-12-24 22:44) [9]


>  [8] Arazel ©   (24.12.05 20:58)
> VirEx  Спасибо! Снаступающим новым 2006  годом ;)
> А ты  незнаеш анналоги ф-ций  ReadDirectoryChangesW для
> Win9x?

тебя также с новым наступающим ))
насчет аналога, вроде как такого аналога нет, там придется работать с драйвером файловой системы, или же как делает программа FileMon - сама устанавливает свой драйвер и через него следит за изменениями в файловой системе, в принципе я делал диплом по написанию драйверов и мог бы сделать такую же ерунду но это же стока времени надо убить) мне ще свой проект надо поддерживать (WinConsul) :)



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

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.036 c
2-1141105829
Mike48
2006-02-28 08:50
2006.03.19
Нужна программа распаковщик файлов с дискеты


6-1134121432
Wiz@rd
2005-12-09 12:43
2006.03.19
WinInet &amp; 404, 403, 301


5-1127717771
DimaBr
2005-09-26 10:56
2006.03.19
Защита компонента


2-1141044416
Познающий глубины
2006-02-27 15:46
2006.03.19
Передача параметров.


6-1133606005
Volf_555
2005-12-03 13:33
2006.03.19
Как изменить прокси-сервер из Delphi?