Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi auf Änderungen im Ordner reagieren (https://www.delphipraxis.net/21048-auf-aenderungen-im-ordner-reagieren.html)

mumu 27. Apr 2004 10:08


auf Änderungen im Ordner reagieren
 
Wie kann ich, wenn eine Datei in einem Ordner erstellt, geändert bzw. gelöscht wird im Delphi darauf reagieren, dass sozusagen ein Ereignis ausgelöst wird.

danke schonmal..

shmia 27. Apr 2004 10:12

Re: auf Änderungen im Ordner reagieren
 
torry.net->Files & Drives->Notification

mumu 27. Apr 2004 11:22

Re: auf Änderungen im Ordner reagieren
 
ja danke, da sind jede menge komponenten dazu.

kann mir vielleicht jemand noch erklären, wie ich allgemein an dieses problem rangeh?

Luckie 27. Apr 2004 12:45

Re: auf Änderungen im Ordner reagieren
 
Stichwort für das MSD: MSDN-Library durchsuchenFindFirstChangeNotification.

Alexander 27. Apr 2004 12:48

Re: auf Änderungen im Ordner reagieren
 
Bei mir gibt's bei Delphi die Komponente TShellChangeNotifier im Reiter Beispiele/Samples bei Delphi 6 und 7.
Wenn dich die API's interessieren, die dafür genutzt werden, dann schau dir einfach den Quelltext dazu von Borland an :P

Übrigens bei Delphi 8 (also .NET) ist es der FileSystemWatcher ;-)

mumu 27. Apr 2004 13:18

Re: auf Änderungen im Ordner reagieren
 
danke luckie... das wollte ich wissen!!! und auch thx an alexander, werd mir die borland quellcodes auch mal reinziehen :-D

Christian Seehase 27. Apr 2004 21:30

Re: auf Änderungen im Ordner reagieren
 
Moin Mumu,

für NT basierte Systeme kommt auch noch ReadDirectoryChangesW in Frage.

Mackhack 30. Apr 2004 02:07

Re: auf Änderungen im Ordner reagieren
 
Zitat:

Zitat von Luckie
Stichwort für das MSD: MSDN-Library durchsuchenFindFirstChangeNotification.

Hi,

ich habe dashier in einem Buch dazu gefunden. Nur wie rufe ich das ganze jetzt auf?

Delphi-Quellcode:
unit DirChangeThread;

interface

Uses
  Classes, Windows, Dialogs;

Type TDirChange = Class(TThread)
  Private
  { Private-Deklarationen }
    Handle : THandle;
    Path : String;
  Protected
    Procedure Execute; Override;
    Procedure RefreshListBox;
    Destructor Destroy;
  Public
  { Public-Deklarationen }
    Constructor Create(Path : String);
  End;

implementation

Uses
  Unit1;

Constructor TDirChange.Create(Path : String);
Begin
  Inherited Create(False);
  Path := Path;
  FreeOnTerminate := True;
End;

Procedure TDirChange.Execute;
Begin
  Handle := FindFirstChangeNotification(PChar(Path), FALSE, FILE_NOTIFY_CHANGE_NAME);
  If Handle <> INVALID_HANDLE_VALUE Then
    While True
    Begin
      If WaitForSingleObject(Handle, 500) = WAIT_OBJET_0 Then
      Begin
        Synchronize(RefreshListBox);
      End;
      FindNextChangeNotification(Handle);
      If Terminated Then
        Break;
    End;
End;

Procedure TDirChange.RefreshListBox;
Begin
  Form1.FileListBox1.Update;
End;

Destructor TDirChange.Destroy;
Begin
  If Handle <> NULL Then
    FindCloseChangeNotification(Handle);
  Inherited Destroy;
End;

end.
Vielen Dank!

Luckie 30. Apr 2004 02:21

Re: auf Änderungen im Ordner reagieren
 
Das ist doch ein ganz normales VCL-Thread-Objekt. Einfach wie jedes andere Objekt erzeugen. Weitere Infos hier: http://Tutorials.luckie-online.de

Mackhack 30. Apr 2004 02:38

Re: auf Änderungen im Ordner reagieren
 
Hi,

leider hab ich noch nie mit Threads gearbeitet.

Also ich habe im Buch den Aufruf so da stehen:

Delphi-Quellcode:
  If Kontrolle <> Nil Then
    Kontrolle.Terminate;
  Kontrolle := TDirChange.Create(DirectoryListBox1.Directory);
Jetzt weis ich aber nicht was Kontrolle sein soll.

2. ist wohl in dem Thread n Fehler drin. Denn der Compiler meckert hier rum:

Delphi-Quellcode:
Destructor TDirChange.Destroy;
Begin
  If Handle <> NULL Then
    FindCloseChangeNotification(Handle);
  Inherited Destroy;
End;
Hinter NULL: Undefinierter Bezeichner NULL!

Was muss da geändert werden?

Danke!

Luckie 30. Apr 2004 03:50

Re: auf Änderungen im Ordner reagieren
 
Kontrolle ist wohle ien Variable vom Typ TDirChange. Sieht man doch hier:
Delphi-Quellcode:
Kontrolle := TDirChange.Create(DirectoryListBox1.Directory);
Das sind Grundlagen!

Und aus was für eine Buch hast du das Beispiel? NULL ist das C/C++ Gegenstück zu Nil in Delphi.

Mackhack 30. Apr 2004 04:02

Re: auf Änderungen im Ordner reagieren
 
Hi,

so meinte ich die Frage aber net auf was Kontrolle ist. Denn ich wollte eher wissen warum dann kein
Var-Abschnitt ist wie z. B.:

Delphi-Quellcode:
Var
  Kontrolle : TDirChange;
Und dann eben erst der Code initialisiert wird wie z. B. bei IniFiles oder was auch immer auch mit:

Delphi-Quellcode:
Begin
  Kontrolle := TDirChange.Create(...);
Desweiteren:

Ich habe Nil verwendet. Operator kann auf diesen Operanten nicht angewendet werden!

Luckie 30. Apr 2004 12:57

Re: auf Änderungen im Ordner reagieren
 
Zitat:

Zitat von Mackhack
Also ich habe im Buch den Aufruf so da stehen:

Delphi-Quellcode:
  If Kontrolle <> Nil Then
    Kontrolle.Terminate;
  Kontrolle := TDirChange.Create(DirectoryListBox1.Directory);

Wenn du mir so ein Bruchstück vom Code zeigst, woher um Gotteswillen soll ich wissen,d as es keien var-Abschnitt oder somnst was gibt?

teste mal auf <> 0. Ich vermute mal das handle vom Typ THandle oder Cardinal ist.

Mackhack 1. Mai 2004 00:03

Re: auf Änderungen im Ordner reagieren
 
Hi,

so sieht mein Code jetzt aus:

Delphi-Quellcode:
procedure TForm1.DirectoryListBox1Change(Sender: TObject);
Var
  Kontrolle : TDirChange;
begin
  If Kontrolle <> 0 Then
    Kontrolle.Terminate;
  Kontrolle := TDirChange.Create(DirectoryListBox1.Directory);
end;
Jetzt kommt in der Zeile <> 0 als Fehler:
Inkompatible Typen :-(

Was mach ich denn da nur falsch?

Christian Seehase 1. Mai 2004 00:14

Re: auf Änderungen im Ordner reagieren
 
Moin MackHack,

tausch mal 0 gegen nil aus.

Mackhack 1. Mai 2004 01:02

Re: auf Änderungen im Ordner reagieren
 
Hallo,

weis jemand warum ich als Hinweis folgendes bekomme:
Auf Kontrolle zugewiesener Wert wird niemals benutzt.

Weis jemand wie ich jetzt mit Hilfe dieses Codes auch rausbekommen kann welche Dateien verändert wurden?

Danke!

Luckie 1. Mai 2004 12:59

Re: auf Änderungen im Ordner reagieren
 
Zitat:

Zitat von Mackhack
weis jemand warum ich als Hinweis folgendes bekomme:
Auf Kontrolle zugewiesener Wert wird niemals benutzt.

Weil auf Kontrolle zugewiesener Wert niemals benutzt wird. :roll:

Mackhack 1. Mai 2004 17:47

Re: auf Änderungen im Ordner reagieren
 
:-)

Lucky kannst du mir dabei noch bitte helfen wie ich rausbekommen kann welche Datei verändert wurde?

Vielen Dank!

toms 1. Mai 2004 17:48

Re: auf Änderungen im Ordner reagieren
 
Hi,

Find*ChangeNotification() liefert dir leider nicht die Datei zurück, welche verändert worden ist.

Du müsstest einen "Snapshot" des Verzeichnisses erstellen, welches überwacht wird und wenn Find*ChangeNotification() eine Veränderung mitteilt, wieder einen "Snapshot" erstellen.
Am Schluss werden dann die beiden Snapshots verglichen und
du weisst dann, welche Datei verändert worden ist.

Unter NT gibt's die ReadDirectoryChangesW():

http://msdn.microsoft.com/library/de...rychangesw.asp

Mackhack 1. Mai 2004 18:11

Re: auf Änderungen im Ordner reagieren
 
Aber macht das ReadDirectoryChangesW nicht das gleiche wie das FindFirstChangeNotification auch?

Oder verstehe ich grad den Text in der MSDN nicht richtig?

Wenn nicht, könntest du mir da vielleicht ein wenig helfen?

Muetze1 1. Mai 2004 18:21

Re: auf Änderungen im Ordner reagieren
 
Moin!

Mach das mit dem SnapShot und merke dir die Dateigrössen und vergleiche beim auslösen der Notification die Grössen. Danach einfach die aktuellen Grössen der Dateien merken bis zum nächsten mal.

MfG
Muetze1

Mackhack 1. Mai 2004 18:31

Re: auf Änderungen im Ordner reagieren
 
Danke Mütze1,

so wie besprochen :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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