![]() |
Ordner überwachen
Also ich bin gerade dabei ein Programm zu schreiben, was einen Ordner oder mehrere überwachen soll.
Überwachen in dem Sinne, ob Dateien hinkommen, etc. Leider hab ich jetzt das Problem, dass ich dazu zwar schon eine Möglichkeit gefunden habe, leider das Ganze aber nicht wirklich verstehe und deshalb würde ich jemanden hier bitten mir es zu erklären oder eine alternative (einfachere) Lösung anzubieten... Ich bin dankbar für jeden Hilfe :)
Code:
function Like(const AString, APattern: String): Boolean;
var StringPtr, PatternPtr: PChar; StringRes, PatternRes: PChar; begin Result:=false; StringPtr:=PChar(AString); PatternPtr:=PChar(APattern); StringRes:=nil; PatternRes:=nil; repeat repeat // ohne vorangegangenes "*" case PatternPtr^ of #0: begin Result:=StringPtr^=#0; if Result or (StringRes=nil) or (PatternRes=nil) then Exit; StringPtr:=StringRes; PatternPtr:=PatternRes; Break; end; '*': begin inc(PatternPtr); PatternRes:=PatternPtr; Break; end; '?': begin if StringPtr^=#0 then Exit; inc(StringPtr); inc(PatternPtr); end; else begin if StringPtr^=#0 then Exit; if StringPtr^<>PatternPtr^ then begin if (StringRes=nil) or (PatternRes=nil) then Exit; StringPtr:=StringRes; PatternPtr:=PatternRes; Break; end else begin inc(StringPtr); inc(PatternPtr); end; end; end; until false; repeat // mit vorangegangenem "*" case PatternPtr^ of #0: begin Result:=true; Exit; end; '*': begin inc(PatternPtr); PatternRes:=PatternPtr; end; '?': begin if StringPtr^=#0 then Exit; inc(StringPtr); inc(PatternPtr); end; else begin repeat if StringPtr^=#0 then Exit; if StringPtr^=PatternPtr^ then Break; inc(StringPtr); until false; inc(StringPtr); StringRes:=StringPtr; inc(PatternPtr); Break; end; end; until false; until false; end; procedure FindAllFiles(FileList: TStrings; RootFolder: string; Mask: string ='*'; Recurse: Boolean = True; AddFolderNames: Boolean = False; IgnoreMaskAtFolderNames: Boolean = True); procedure LFindAllFiles(AParentFolder: String); var LSearchRec: TSearchRec; begin if FindFirst(AParentFolder + '*', faAnyFile, LSearchRec) = 0 then begin repeat if (LSearchRec.Name <> '.') and (LSearchRec.Name <> '..') then begin if LSearchRec.Attr and faDirectory = faDirectory then begin if AddFolderNames and (IgnoreMaskAtFolderNames or Like(AnsiLowerCase(LSearchRec.Name), Mask)) then FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(True)); if Recurse then LFindAllFiles(AParentFolder + LSearchRec.Name + '\'); end else if Like(AnsiLowerCase(LSearchRec.Name), Mask) then FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(False)); end; until FindNext(LSearchRec) <> 0; FindClose(LSearchRec); end; end; begin Mask := AnsiLowerCase(Mask); LFindAllFiles(IncludeTrailingPathDelimiter(RootFolder)); end; |
AW: Ordner überwachen
PS: [DP]Ordner überwachen[/DP]
Was du da hast, ist ein Code, welcher den Inhalt eines Ordner auflistet. Zum Überwachen müßtest du jetzt/später nochmal den Inhalt auflisten, mit der alten Liste vergleichen und würdest damit den Unterschied rausbekommen. Auf diese Weise kann man einen alten Zustand mit dem Aktuellen vergleichen und auch ältere Änderungen rausbekommen. Willst du aber wirklich überwachen, dann laß dich doch vom Windows über Änderungen informieren (siehe die anderen Themen). |
AW: Ordner überwachen
Was es macht weiß ich schon, die Frage ist noch wie ich es auflisten kann. Das verwirrt mich ...
Das Programm soll im späteren Verlauf noch anderes machen, deshalb ... |
AW: Ordner überwachen
Bei der Überwachung bekommst du doch auch Informationen was sich geändert hat ( geänderte/neue Datei)
|
AW: Ordner überwachen
Meine Frage ist, wie ich es darstellen kann. Also z.b. was ich machen muss, damit er sie auflistet.
|
AW: Ordner überwachen
Zitat:
|
AW: Ordner überwachen
Wobei ich doch schon sagte, daß diese Funktion selber keine Laufwerksüberwachung darstellt.
FindAllFiles sucht im angegebenen Verzeichnis nur nach den Dateien, welche deinen Suchparametern entsprechen ... genau so, wie es der Funktionsname auch besagt. Für eine "Überwachung" müstest du also zwei Suchergebnisse "selber" vergleichen und die unterschiede finden. Wie man den Inhalt von zwei Stringlisten rausbekomme, wirst du doch wohl wissen? z.B. - Liste_1 durchlaufen, all deren Zeilen in Liste_2 suchen und dort löschen - das Selbe nun andersrum machen, also alles aus Liste_2 in Liste_1 löschen. = nun stehen in einer Liste nur noch alle neuen Dateien und in der anderen alle gelöschten Dateien Ob sich eine Datei aber verändert hat, bekommst du so nicht raus, denn dafür müstest du mehr speichern, als nur die Dateinamen. Wie z.B. Dateigröße und Änderungsdatum, welches man dann ebenfalls mit vergleichen müste. Vorschläge für eine "ordentliche" Live-Verzeichnisüberwachung wurden ber auch shcon mehrmals aufgezeigt (in den anderen auffindbaren Threads) |
AW: Ordner überwachen
Okay, danke.
Ich weiß, dass er nur Dateinamen vergleicht, dass soll er auch ... später werde ich das mit der Dateigröße noch hinzufügen. Zitat:
Und eins ist mir noch unklar, wie kann ich diese Prozedur jetzt ausführen ? --> Befehl und Parameter ? Diesen Befehl hätte ich jetzt benutzt, mit einer *.OnKlick, dass er das ausführt und dann auflistet. Würde das so gehen (im grundsätzlichen) ?
Delphi-Quellcode:
var
f : string; begin f := FindAllFiles('*.*', 'C:\Benutzer\Admin\Downloads'); //Da kommt: E2010 Inkompatible Typen: 'TStrings' and 'String' ListBox1.? := FileList(f); //Hier weiß ich nicht weiter bei '?' |
AW: Ordner überwachen
Eine Überwachung in Echtzeit ist das alles nun aber nicht gerade.
Das aber läßt sich mit Hilfe der WinAPI und ggf. in einem eigenen Thread machen, wie z.B. für das Hinzufügen, Löschen oder Rename eines Files nach diesem Grundgerüst:
Code:
Var NotificationHandle: Cardinal;
Response: Cardinal; FolderToMonitor: String; // das zu überwachende Verzeichnis Monitoring: Boolean; // zur Steuerung der Schleife auch aus dem Hauptthread heraus function WaitFor(Hdl: Cardinal; Timeout: Cardinal = INFINITE): Cardinal; begin Result := WaitForSingleObject(Hdl, Timeout); end; NotificationHandle := FindFirstChangeNotification(PChar(FolderToMonitor), FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); if (NotificationHandle <> INVALID_HANDLE_VALUE) then exit; While monitoring do begin Response := WaitFor(NotificationHandle, 100); // oder anderen Timeout, aber timeout:=INFINITE ist nicht empfehlenswert if (Response = WAIT_OBJECT_0) then begin // jetzt darauf reagieren ... // bzw. eine entspr. Message an den Hauptthread reichen: Synchronize(MitWelcherProzedurAuchImmer); // und dann entweder abbrechen (mit Break aus der Schleife) // oder aber fortsetzen mit: FindNextChangeNotification(NotificationHandle); end; Application.ProcessMessages; // dies jedoch nicht in einem eigenen Thread end; |
AW: Ordner überwachen
Ist in der Funktion jetzt enthalten, dass er das Verzeichnis scannt ?
Und bei "Jetzt darauf reagieren", muss ich schreiben, dass das was er aus dem letzten Scann hat, mit einem anderen vergleichen soll, oder? |
AW: Ordner überwachen
Dort wo dieser Kommentar steht, kannst du "irgendwas" machen, denn dieser Teil wird ja aufgerufen, wenn sich irgendwo, im überwachten Bereich, eine Datei geändert hat.
Genauere Informationen, findet man bei der Beschreibung zur Funktion: ![]() Oder in den anderen Threads. (siehe Beitrag #2) Für die, welche die Suchfunktion nicht kennen: [DP]Ordner überwachen[/DP] (auf diese Suchworte kommt man natürlich nie) [DP]Verzeichnis überwachen[/DP] (Ähnliches) ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 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