08. august 2000 - 19:14Der 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.
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 :=)
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.
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 :
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 :
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...)
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.
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.
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 :))
Synes godt om
Ny brugerNybegynder
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.