Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dateiänderungen überwachen (https://www.delphipraxis.net/105930-dateiaenderungen-ueberwachen.html)

SnuffMaster23 2. Jan 2008 14:02


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

mkinzler 2. Jan 2008 14:06

Re: Dateiänderungen überwachen
 
Du könntest es mit einer ShellNotify-Kompo versuchen

QuickAndDirty 2. Jan 2008 14:25

Re: Dateiänderungen überwachen
 
Zitat:

Zitat von SnuffMaster23
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

So machen viele Programme das wenn sich früher(noch vor DDE und OLE ) 2 Programme unterschiedlicher Hersteller unterhielten hat man das über das setzen und löschen und überwachen von solchen Semaphoren gemacht.

SnuffMaster23 2. Jan 2008 14:43

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?^^

mkinzler 2. Jan 2008 15:02

Re: Dateiänderungen überwachen
 
-ShellNotify: http://www.delphi.com.ar/
Oder in der JVCL gibt es auch eine

Christian Seehase 2. Jan 2008 15:13

Re: Dateiänderungen überwachen
 
Moin Snuffmaster,

alternativ ginge auch ReadDirectoryChangesW.
Zu beidem wirst Du aber auch hier in der DP einiges an Beispielen finden.

SnuffMaster23 4. Jan 2008 18:38

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 hier.

Delphi-Quellcode:
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;
//Edit: Fähla korrigiert

C.Schoch 4. Jan 2008 19:16

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.

SnuffMaster23 5. Jan 2008 14:08

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^^

Christian Seehase 5. Jan 2008 14:28

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 16:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz