AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ordner überwachen

Ein Thema von Skullwing · begonnen am 29. Okt 2011 · letzter Beitrag vom 29. Okt 2011
Antwort Antwort
Seite 1 von 2  1 2      
Skullwing

Registriert seit: 29. Okt 2011
12 Beiträge
 
#1

Ordner überwachen

  Alt 29. Okt 2011, 14:06
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#2

AW: Ordner überwachen

  Alt 29. Okt 2011, 14:19
PS: Hier im Forum suchenOrdner überwachen

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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Skullwing

Registriert seit: 29. Okt 2011
12 Beiträge
 
#3

AW: Ordner überwachen

  Alt 29. Okt 2011, 15:05
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 ...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Ordner überwachen

  Alt 29. Okt 2011, 15:46
Bei der Überwachung bekommst du doch auch Informationen was sich geändert hat ( geänderte/neue Datei)
Markus Kinzler
  Mit Zitat antworten Zitat
Skullwing

Registriert seit: 29. Okt 2011
12 Beiträge
 
#5

AW: Ordner überwachen

  Alt 29. Okt 2011, 15:55
Meine Frage ist, wie ich es darstellen kann. Also z.b. was ich machen muss, damit er sie auflistet.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#6

AW: Ordner überwachen

  Alt 29. Okt 2011, 16:32
Meine Frage ist, wie ich es darstellen kann. Also z.b. was ich machen muss, damit er sie auflistet.
Die Funktion wird mit dem Parameter FileList aufgelistet. Diese Liste must du nur anzeigen oder beispielsweise in eine Combobox oder ähnliches laden. Du kannst auch ein Grid nehmen, wo du die Zeilen einzeln eintragen kannst.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#7

AW: Ordner überwachen

  Alt 29. Okt 2011, 17:02
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Skullwing

Registriert seit: 29. Okt 2011
12 Beiträge
 
#8

AW: Ordner überwachen

  Alt 29. Okt 2011, 17:43
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:
Vorschläge für eine "ordentliche" Live-Verzeichnisüberwachung wurden ber auch shcon mehrmals aufgezeigt (in den anderen auffindbaren Threads)
Könntest du mir einen Link dazu geben ?

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

Geändert von Skullwing (29. Okt 2011 um 18:24 Uhr)
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Ordner überwachen

  Alt 29. Okt 2011, 18:42
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;
  Mit Zitat antworten Zitat
Skullwing

Registriert seit: 29. Okt 2011
12 Beiträge
 
#10

AW: Ordner überwachen

  Alt 29. Okt 2011, 19:21
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?

Geändert von Skullwing (29. Okt 2011 um 19:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:51 Uhr.
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