![]() |
Dateiänderungen überwachen
Hi,
ich suche eine Möglichkeit um auf Änderungen in bestimmten Dateien zu reagieren. Ich will damit Sourcefiles per FTP hochladen sobald sie gespeichert (eben geändert) werden. Ich weiß nicht wie Dateimanager sowas handhaben, aber die (Explorer mal ausgenommen^^) kriegen die Änderungen immer mit einer kleinen Verzögerung mit. Diese Verzögerung scheint mir immer recht gleich zu sein, das spricht dafür dass sie benachrichtigt werden. Mir würde es ja auch schon reichen wenn ich das Verzeichnis überwachen könnte. Die Alternative wäre halt mit nem Timer immer nachzugucken ob sich was geändert hat aber das erscheint mir zu trivial :D |
Re: Dateiänderungen überwachen
Du könntest es mit einer ShellNotify-Kompo versuchen
|
Re: Dateiänderungen überwachen
Zitat:
|
Re: Dateiänderungen überwachen
ShellNotify klingt gut, aber ich find sie nicht :D
Beim danach googeln bin ich auf FindFirstChangeNotification gestoßen, das dürfte mir genügen. Danke euch! //Edit: brr, was war denn das für Deutsch?^^ |
Re: Dateiänderungen überwachen
|
Re: Dateiänderungen überwachen
Moin Snuffmaster,
alternativ ginge auch ReadDirectoryChangesW. Zu beidem wirst Du aber auch hier in der DP einiges an Beispielen finden. |
Re: Dateiänderungen überwachen
Also nachdem ich mich ne Weile mit den API-Funktionen rumgeschlagen hab hab ich mal ShellNotify ausprobiert.
Das hat zwar immer brav geschriehen wenn was passiert is, aber es konnte mir keinen Dateinamen liefern und hat immer gemeint dass sich was am Verzeichnis geändert hat. Ein bisschen zu ungenau für mich^^ Ich habs jetz ausschließlich mit ReadDirectoryChangesW mit dem Code von ![]()
Delphi-Quellcode:
//Edit: Fähla korrigiert
procedure TMonitorThread.Execute;
var pBuf: Pointer; dwBufLen: DWORD; dwRead: DWORD; FNI: FILE_NOTIFY_INFORMATION; pWork: Pointer; sFileName: Widestring; i: Integer; begin dwBufLen := 65536; pBuf := AllocMem(dwBufLen); while not terminated do begin ReadDirectoryChangesW(Form1.DirHandle, pBuf, dwBufLen, subDirs, FILE_NOTIFY_CHANGE_LAST_WRITE, @dwRead, nil, nil); pWork := pBuf; repeat StrMove(@FNI,pWork,12); PChar(pWork) := PChar(pWork)+12; sFileName := StringOfChar(#00,FNI.dwFileNameLength); StrMove(@sFileName[1],pWork,FNI.dwFileNameLength); FsFileName := WideCharToString(PWideChar(sFileName)); FsFileName := copy(FsFileName,1,length(FsFileName) shl 1); PChar(pWork) := PChar(pBuf)+FNI.dwNextEntryOffset; for i := 0 to Watches.Count - 1 do // if Like(FsFileName, Watches[i]) then // mit ein paar Wildcard-Mustern vergleichen begin Synchronize(UploadFile); break; end; until FNI.dwNextEntryOffset = 0; end; FreeMem(pBuf,dwBufLen); end; |
Re: Dateiänderungen überwachen
Hi,
Hast du das mal ein bischen laufen lassen? Bei mir hats nämlich in der repeat schleife ab und zu mal eine Exception gegeben. |
Re: Dateiänderungen überwachen
Richtig benutzt hab ichs noch nicht aber natürlich ausprobiert, dabei ist noch nix passiert. Ich werds heut mal exzessiv nutzen.
Fertig isses ja noch nicht, wenn ich den TThread terminiere hängt er ja noch in ReadDirectoryChangesW und kriegt noch die nächste Änderung mit. Das is besonders unschön wenn ich nen neuen Thread mit anderen Einstellungen starte und der alte lauscht noch mit^^ |
Re: Dateiänderungen überwachen
Moin SnuffMaster,
ich hab' hier auch mal ein Beispiel gepostet, wie man ReadDirectoryChangesW asynchron benutzt (mit Overlapped), weil mich das mit dem nicht beendbaren Thread auch genervt hat ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz