Avatar billede speedy Nybegynder
08. august 2000 - 19:14 Der er 6 kommentarer og
2 løsninger

Event når filsystem ændres

Hej

Hvordan kan man få windows til at fortælle at der er blevet lavet ændringer i en fil, eller oprettet en fil, eller slettet en fil ??

Hvis i ikke forstår, kan i prøve at søge efter filer i windows, og søge efter *.* Når den har gennemsøgt roden af drev C, skal du oprette en fil (ligegyldigt hvilken) den skal bare være tom. Whuuuip, så dukker den frem i søgeboksen.

Derfor må man kunne få windows til at give en event når der bliver ændret, oprettet, eller slettet en fil.

Men hvordan ??

/SpEeDy
Avatar billede lrj Nybegynder
08. august 2000 - 19:29 #1
Jeg har prøvet indtil flere komponenter som påstod at de gav en event når der var en opdatering i filsystemet - i det bibliotek som man overvågede. Men jeg har aldrig fået nogen af dem til at virke. Så jeg er med på en lytter :=)
Avatar billede mipe1 Nybegynder
08. august 2000 - 20:34 #2
Har du set i delphi-hjælpen, nærmere bestemt i
\"win32 programmer\'s reference\" der omtales noget
omkring \"event-logging\" og mit bud er, at det er det du skal have fat i.
Avatar billede fehaar Nybegynder
08. august 2000 - 20:47 #3
Det du skal benytte er noget der hedder \"change notifications\". For at det ikke blokerer dit program at du skal vente på at filen ændres er det bedst at lægge den kode ud i en seperat tråd. Denne kode laver en klasse til at overvåge en fil :

**********************************

unit FileNotifyThread;

interface

uses
  Classes, Windows;

type
  TFileNotifier = class(TThread)
  private
    { Private declarations }
    h : THandle;
    FOnChange : TNotifyEvent;
    FFileName : string;
    FFiletime : integer;
    FFilepath : string;
  protected
    procedure Execute; override;
    procedure SetFilename(s : string);
    function LGetFileTime(s : string) : integer;
  public
    property Filename : string read FFilename write SetFilename;
    property OnChange : TNotifyEvent read FOnChange write FOnChange;
  end;

implementation

uses
  SysUtils;

{ TFileNotifier }

procedure TFileNotifier.Execute;
var
  d : DWORD;
  i : integer;

begin
  { Place thread code here }
  while not Terminated do
    if FFileName <> \'\' then begin
      {Wait for dir-date to be changed, timeout is 10 sec}
      d := WaitForSingleObject(h, 10000);
      if d = WAIT_OBJECT_0 then begin
        {If it in fact has been changed, check file time}
        i := LGetFileTime(FFileName);
        if FFileTime <> i then begin
          {If it is the file that has changed, notify}
          FFileTime := i;
          if Assigned(FOnChange) then
            FOnChange(self);
          FindNextChangeNotification(h);
        end;
      end;
    end;
end;

procedure TFileNotifier.SetFilename(s : string);
begin
  Assert(FileExists(s), \'File does not exist\');
  if s <> FFilename then begin
    FFilename := s;
    FFiletime := LGetFileTime(FFileName);
    FFilepath := ExtractFilePath(FFileName);
    FFilePath := Copy(FFilePath, 0, Length(FFilePath) - 1);
    h := FindFirstChangeNotification(PChar(FFilePath), False, FILE_NOTIFY_CHANGE_LAST_WRITE);
  end;
end;

function TFileNotifier.LGetFileTime(s : string) : integer;
var
  sr : TSearchRec;

begin
  {Fuction to get file time as integer}
  if FindFirst(FFileName, faAnyFile, sr) = 0 then begin
    Result := sr.Time;
    FindClose(sr);
  end else
    Result := 0;
end;

end.

********************************

Du laver så en instans af den klasse f.eks. således :

FFileNotify := TFileNotifier.Create(True);
FFileNotify.OnChange := FileNotify;
FFileNotify.FreeOnTerminate := True;

FileNotify er en procedure med flg. dekleration, der bliver kaldt når filen ændres :

procedure FileNotify(Sender: TObject);

Derefter kan du sætte navnet på den fil du vil overvåge på følgende måde :

FFileNotify.Filename := <navnet på filen>
Avatar billede speedy Nybegynder
09. august 2000 - 07:37 #4
fehaar>> Det er ikke en speciel fil, som jeg vil overvåge. Det er f.eks. en hel mappe.

Og så er det ikke kun ændringer i filen, men også hvis den bliver slettet, eller der bliver oprettet en ny fil i mappen der overvåges.

/SpEeDy
Avatar billede delphi Nybegynder
09. august 2000 - 08:22 #5
Jeg har lige tid til en lytter på dette interessante spørgsmål.

Vedr. overvågning af mappe:
En mappe (et dir) er vel at betragte som en fil i sig selv, således at forstå, at hvis en fil ændres (osv) inden i en mappe, så vil selve mappens status (date/time stamp) ændres.  Det må derfor være muligt at benytte ovenstående code, som jeg altså ikke har afprøvet, med mappens navn som filnavn....?  (Som de siger i TV: Prøv det...)

mvh Delphi.
Avatar billede fehaar Nybegynder
09. august 2000 - 08:36 #6
Hvis du kigger i koden til FileNotifyThread er det faktisk en mappe jeg overvåger på og derefter chekcer om filen er ændret. Man kan derfor bruge den samme kode til blot at overvåge mapper med lidt ændring.
Avatar billede borrisholt Novice
09. august 2000 - 12:13 #7
På min hjemme side på adressen Http://borrisholt.com Ligger der er eksempel, med source code, der kan hvad du beder om. Du skal kigge under \"FileIO\" og derfra downloade eksemplet FindFirstNOTIFY.

Jens B
Avatar billede speedy Nybegynder
13. august 2000 - 17:27 #8
Jeg går ud fra at fehaar\'s svar virkede. Derfor synes jeg også at han skal have point. (Jeg har dog ikke testet det)

Borrisholt>> Lige hvad vi manglede.

/SpEeDy

Jeg deler points\'ne lige over, håber i er tilfredse :))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester