Entwickler-Ecke

Dateizugriff - Ordner überwachen


Tilman - Mo 11.12.06 21:09
Titel: Ordner überwachen
Ich möchte einen Ordner überwachen, und neu erstellte bzw. verschobene Dateien sofort in "Archiv"+Fortlaufende Nummer umbenennen. Kann mir jemand sagen wie man am schlausten einen ordner überwacht?


ZeitGeist87 - Mo 11.12.06 21:41

Hallo!

Entweder programmierst du dir einen Service der das ganze überwacht und meinetwegen eine Hash-Tablelle führt und bei Veränderung das vornimmt, was du gedenkst oder du lädst dir die JEDIs runter, da gibt es meines Wissens so ne Komponente die das für dich erledigt.

LG
Stefan


wulfskin - Mo 11.12.06 21:48

Hallo,

für Windows 2000 und darüber, verwendest du am besten Suche im MSDN READDIRECTORYCHANGESW. Für alles darunter gibt es [/msdn]FindFirstChangeNotification[/msdn], da bekommst du aber (wenn ich mich recht entsinne) nicht mit, welche Datei geändert wurde.

Viel Erfolg,
Hape


Tilman - Di 12.12.06 02:46

Ne, ob eine Datei geändert wurde muss ich gar nicht wissen. Es geht nur um neue Dateien. Es würde schon reichen eine Liste aller Dateien im ordner in einem gewissen intervall abzufragen, allerdings habe ich halt keine ahnung wie mans o was macht. Ist das möglich?


Ironwulf - Di 12.12.06 03:51

sicher, du lädst die dateinamen in eine stringlist dann lädst du in einem timer nochmal alle datein in eine andere stringlist und schaust ob ne neue dazu gekomm is, wenn ja dann tust du halt das mit der datei was du vorhast und lädst die stringlist für den ordner neu


Tilman - Di 12.12.06 18:29

user profile iconIronwulf hat folgendes geschrieben:
sicher, du lädst die dateinamen in eine stringlist dann lädst du in einem timer nochmal alle datein in eine andere stringlist und schaust ob ne neue dazu gekomm is, wenn ja dann tust du halt das mit der datei was du vorhast und lädst die stringlist für den ordner neu


Soweit, so gut, aber wie bekomme ich die Liste aller Dateien in einem Ordner?


Delete - Di 12.12.06 18:35

2 simple tips:

a) TJVFileSearch von den JEDI-Komponenten benutzen oder
b) auf diesen Link eine andere Komponente laden:
http://www.angusj.com/delphi/dirwatch.html

Gruß

rd3


Tilman - Di 12.12.06 18:44

Hmm, würde es gern ohne Komponent machen. Gibt es nicht ne funktion die mir eine Liste zurückgibt?


Ironwulf - Di 12.12.06 18:45

user profile iconTilman hat folgendes geschrieben:

Soweit, so gut, aber wie bekomme ich die Liste aller Dateien in einem Ordner?


mal die suche bemühen, hier gibs paar feine proceduren die nitma 20 zeilen klang sinn die das sehr gut können


Tilman - Di 12.12.06 18:49

user profile iconIronwulf hat folgendes geschrieben:

mal die suche bemühen, hier gibs paar feine proceduren die nitma 20 zeilen klang sinn die das sehr gut können


Mensch vielen Dank, du hilfst mir unheimlich. Noch mehr allerdings wenn du mir noch die Suchwörter sagst bzw. wie die Prozedur heißt, oder hab ich da was übersehen in deinem Post?


Ironwulf - Di 12.12.06 18:56

;D wenn man nit alles selber macht funktioniert hier gar nix mehr XD


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
Procedure FindFiles (aPath, aFindMask: String; aWithSub: Boolean; aResult: tStrings);
Var
FindRec: tSearchRec;
Begin
  //aPath Gibt an in welchem Verzeichnis nach Datein gesucht werden soll
  //aFindMask Gibt an nach welchen Dateien gesucht werden soll. Z. B. nach allen Textdateien ('*.txt')
  //aResult Gibt die Stringliste an in der die Suchergebnisse eingetragen werden. Das könnte z. B. die Eigenschaft Items einer tListbox sein.

  // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen
  If aPath[Length (aPath)] <> '\' Then
    aPath := aPath + '\';

  // Im aktuellen Verzeichnis nach der Datei suchen
  If FindFirst (aPath + aFindMask, faAnyFile, FindRec) = 0 Then
    Repeat
      // ...Ergebnis in die Stringlist einfügen
      If (FindRec.Name <> '.'and (FindRec.Name <> '..'Then
      begin
      If aResult = Unterverzeichnisse Then aResult.Add(FindRec.Name)
      else aResult.Add(apath + FindRec.Name);
      end;

    Until FindNext (FindRec) <> 0;

    If Not aWithSub Then Exit;

    // In Unterverzeichnissen weiter suchen
    If FindFirst (aPath + '*.*', faAnyFile, FindRec) = 0 Then
    Repeat
      If (FindRec.Name <> '.'and (FindRec.Name <> '..'Then
      // Feststellen, ob es sich um ein Verzeichnis handelt
      // Funktion erneut aufrufen, um Verzeichnis zu durchsuchen (Rekursion)
      If Boolean (FindRec.Attr and faDirectory) Then FindFiles(aPath + FindRec.Name, aFindMask, aWithSub, aResult);
    Until FindNext (FindRec) <> 0;

  FindClose (FindRec);
end;


EDIT:

und so ruft man das ganze zum bsp. auf

Delphi-Quelltext
1:
FindFiles('C:''*', False, sl); //es werden alle datein (Pfad und dateiname) in C: ohne untervrezeichnisse in sl geladen                    


azubi_20 - Di 12.12.06 18:57

Vorschlag für Suche hier im Forum : Suche in: Delphi-Forum DATEI REKURSIV


Tilman - Di 12.12.06 19:02

Danke an euch beide. Wo ichs finde hätte schon gereicht, aber danke für den Quelltext ;-)


// Edit:

Alles klar, habe jetzt die Funktion von FindFirst und FindNext verstanden, werde damit arbeiten.