Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1140674894
7BB
2006-02-23 09:08
2006.03.19
Оберон, Модула


11-1122494631
feens
2005-07-28 00:03
2006.03.19
RegisterHotKey (KOL)


15-1140878006
Ega23
2006-02-25 17:33
2006.03.19
С Днём рождения! 23 февраля


15-1140637091
Некто
2006-02-22 22:38
2006.03.19
Перепрошил БИОС материнской платы. Теперь проблема.


2-1141457905
Piero
2006-03-04 10:38
2006.03.19
Строки в TMemo разных цветов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский