Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизОпределить что изменился файл? Во всей Файловой системе? Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.011 c