Announcement

Collapse
No announcement yet.

wie kann man Verzeichnisse oder Laufwerke spiegeln?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • wie kann man Verzeichnisse oder Laufwerke spiegeln?

    Kann mir jemand helfen???<br>
    Ich versuche 2 Verzeichnisse zu spiegeln. Das heißt:<br>
    - alles was im Quellverzeichnis neu ist (auch Unterverzeichnisse)<br>
    solle kopiert werden<br>
    - alles was gelöscht wurde solle auch im Zielverzeichnis gelöscht<br>
    werden<br>
    (ähnlich wie bei "Robocopy" die Option "/Mir"<br>
    Ich bin für jeden hilfreichen Hinweis dankbar.<br>
    ah.<br>

  • #2
    Hallo,

    wenn das Spiegeln des Verzeichnisinhalts nur in eine Richtung benötigt wird, ist die Win32-API-Funktion <b>ShFileOperation</b> in der Lage, alle arbeiten ohne grossen Aufwand zu erledigen: <br>
    1. Alle Dateien im Zielverzeichnisbaum löschen. <br>
    2. Alle Dateien vom Quellverzeichnisbaum in das Ziel kopieren. <br>
    Beispiele für das Löschen/Kopieren von Verzeichnisbäumen über diese API-Funktion habe ich im Forum bereits gepostet - man findet diese Beiträge über die Suche nach ShFileOperation. Wenn das vorherige Löschen zu riskant ist, kann der Schritt 2 mit einem temp. anderen Verzeichnisnamen vorgezogen werden. Im Schritt 3 wird dann das Zielverzeichnis nach dem Löschen des alten umbenannt.

    P.S: Ansonsten muss man alle Dateien in 2 TStringList-Instanzen sortieren und Eintrag für Eintrag abarbeiten. Bei umfangreichen Verzeichnisbäumen wird es aus Geschwindigkeitsgründen notwendig sein, jedes einzelne Verzeichnis separat in den Listen zu bearbeiten.
    &#10

    Comment


    • #3
      wobei "P.S:" wohl die schnellere und bessere Variante darstellt, wenn nur ein paar Dateien tatsächlich verändert wurden
      Günther

      Comment


      • #4
        Und wie kann ich einen Verzeichnisbaum einleses ohne die Componente TDirectoryListBox nutzen zu müssen.<br>
        (Ich möchte eine Konsolen-Anwendung schreiben)<br>
        <p>
        Danke schon mal für die sehr hilfreichen Tipp's.<br&gt

        Comment


        • #5
          FindFirstFile, FindNextFile, FindClose. Beispiel in C könnte ich am Wochenende nachreichen, aber siche hat jemand ein Delphi-Beispie
          Günther

          Comment


          • #6
            Hallo,

            man kann die "alten" API- bzw. Pascal-Funktionen nutzen und alles selber schreiben. Eleganter ist jedoch der einfache Weg, auf die neuen Fähigkeiten der aktuellen Win32-Betriebssystemversionen zurückzugreifen. In der Regel wird die <b>Microsoft Scripting Engine</b> wohl auf jedem Rechner vorhanden sein. Somit steht das neue <b>FileSystemObject</b> zur Verfügung - und dieses Objekt kann Verzeichnissbäume auflisten. Für das folgende Beispielprojekt muss die Typbibliothek der Microsoft Scripting Runtime importier werden:
            <pre>
            ...
            aFSO := CoFileSystemObject.Create;
            aFld := aFSO.GetFolder(EditDOCPath.Text);
            aFiles := aFld.Files;
            // Alle Dateien aus diesem Verzeichnis prüfen
            pEnum := aFiles.Get__NewEnum as IEnumVARIANT_D4;
            while (TRUE) do
            begin
            hRes := pEnum.Next(1, vOut, @dwRetrieved);
            if hRes <> S_OK then
            Break;
            aFile := IDispatch(vOut) as IFile;
            if aFile.Type_ = 'Microsoft Word-Dokument' then
            begin
            ShowStatusInfo('Bearbeite ' + aFile.Name);
            vDOCPath := aFile.Path;
            vReadOnly := True;
            .....
            Inc(iDone);
            StaticTextDone.Caption := IntToStr(iDone);
            end;
            end;
            </pre>
            Steht Word 2000 zur Verfügung, wird es noch einfacher. Das <b>FileSearch</b>-Objekt ist noch flexibler als die Scripting Engine:
            <pre>
            procedure TForm1.ButtonSearchClick(Sender: TObject);
            var
            aWordApp : _Application;
            aFS : Office_TLB.FileSearch;
            iDOCs : Integer;
            begin
            ButtonSearch.Enabled := False;
            ListBox1.Items.Clear;
            iDOCs := 0;
            StatusBar1.SimpleText := 'Suche.....';
            aWordApp := CoWordApplication.Create;
            try
            aFS := aWordApp.FileSearch;
            aFS.LookIn := EditPath.Text;
            aFS.FileName := '*.doc';
            aFS.SearchSubFolders := CheckBoxSubFolders.Checked;
            if aFS.Execute(msoSortByFileName, msoSortOrderAscending, False) > 0 then
            begin
            iDOCs := aFS.FoundFiles.Count;
            if CheckBoxShowFiles.Checked then
            ShowFileSearchFiles(aFS.FoundFiles);
            end;
            finally
            aWordApp.Quit(EmptyParam, EmptyParam, EmptyParam);
            ButtonSearch.Enabled := True;
            end;
            StatusBar1.SimpleText := Format('%d DOC-Dateien gefunden.', [iDOCs]);
            end;

            procedure TForm1.ShowFileSearchFiles(aObj: FoundFiles);
            var
            pEnum : IEnumVARIANT_D4 ;
            vOut : VARIANT ;
            dwRetrieved : DWORD ;
            hRes : HResult;
            begin
            pEnum := aObj.Get__NewEnum as IEnumVARIANT_D4;
            while (TRUE) do
            begin
            hRes := pEnum.Next(1, vOut, @dwRetrieved);
            if hRes <> S_OK then
            Break;
            if vOut <> Null then
            ListBox1.Items.Add(vOut);
            end;
            end;
            </pre>
            Beide Beispielprogramm stammen aus einem Beitrag, der in der nächsten Ausgabe von DER ENTWICKLER erscheint (also am 16.02.2000)

            Comment


            • #7
              Sieh mal unter www.gwdedv nach, da gibt es eine Software, die Dir vielleicht weiterhilft

              Comment

              Working...
              X