Zum Inhalt springen

Copydir (nur veränderte Daten)


JoachimQ

Empfohlene Beiträge

Hallo!!!

Im Internet habe ich die Funktion Copydir gefunden.

Wie kann man die Funktion so umschreiben, dass sie nur Dateien kopiert, die sich verändert haben (veränderte Dateigröße oder anderes Datum)?


function CopyDir(const fromDir, toDir: string): Boolean;

var

  fos: TSHFileOpStruct;

begin

  ZeroMemory(@fos, SizeOf(fos));

  with fos do

  begin

    wFunc  := FO_COPY;

    fFlags := FOF_FILESONLY;

    pFrom  := PChar(fromDir + #0);

    pTo    := PChar(toDir)

  end;

  Result := (0 = ShFileOperation(fos));

end;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab grad mal ein älteres Projekt von mir rausgesucht (das wurde aber nie 100% fertig, sollte aber zumindest mal ne Idee geben und das funkt. denk ich auch):


//******************************************************************************

//*** TfrmMain.StartCopy

//***

//*** Verzeichniss kopieren

//******************************************************************************

procedure TfrmMain.CopyFiles(AFrom, ATo: String);

var FOS: TSHFileOpStruct;

    SR: TSearchRec;

    Aborted: Boolean;

    Src, Trgt: PChar;

    FNrFiles: Integer;

begin

  Aborted:= False;

  //*** Slash an Pfade anhängen

  AFrom:= AFrom + '\';

  ATo:= ATo + '\';

  //*** Anzahl Dateien im From Pfad die kopiert werden

  FNrFiles:= 0;

  if FindFirst(AFrom + '*.*', faAnyFile, SR) = 0 then

  begin

    repeat

      if (SR.Attr <> faDirectory) then

      begin

        if ((SR.Name <> '.') and (SR.Name <> '..')) then

        begin

          if IsFileOlder(SR.Name, ATo, SR.Time) then

          begin

            Inc(FNrFiles);

          end;

        end;

      end;

    until FindNext(SR) <> 0;

    FindClose(SR);

  end;

  //*** anzahl Dateien in fortschrittsanzeige setzen

  frmProgress.FileMax:= FNrFiles;

  //*** Alle Datein im From-Pfad

  if FindFirst(AFrom + '*.*', faAnyFile, SR) = 0 then

  begin

    repeat

      if (SR.Attr <> faDirectory) then

      begin

        if ((SR.Name <> '.') and (SR.Name <> '..')) then

        begin

          //*** Prüfen ob älter (FOnlyNewer = False wird in der Funktion geprüft)

          if IsFileOlder(SR.Name, ATo, SR.Time) then

          begin

            //*** File in fortschrittsanzeige setzen

            frmProgress.CurFile:= SR.Name;

            //***

            Src:= PChar(AFrom + SR.Name+#0#0);

            Trgt:= PChar(ATo + SR.Name+#0#0);

            //*** Struct füllen

            FillChar(FOS, SizeOf(FOS), #0);

            FOS.Wnd:= Handle;

            FOS.wFunc:= FO_COPY;

            FOS.pFrom:= Src;

            FOS.pTo:= Trgt;

            //*** kein Dialog, wird durch eigenen angezeigt

            FOS.fFlags:= FOF_ALLOWUNDO or FOF_NOCONFIRMATION;

            FOS.fAnyOperationsAborted:= Aborted;

            //*** Datei kopieren

            SHFileOperation(FOS);

          end;

        end;

      end;

    until FindNext(SR) <> 0;

    FindClose(SR);

  end;

end;


//******************************************************************************

//*** TfrmMain.IsFileOlder

//***

//*** Vergleicht ob eine Datei in einem Pfad älter als eine FileDate ist

//*** Wenn nicht nur neuere kopiert werden sollen (FOnlyNewer) wird unabhängig

//*** vom Datum "True" zurückgeliefert

//******************************************************************************

function TfrmMain.IsFileOlder(AName, APath: String; OlderThan: Integer): Boolean;

begin

  Result:=  ((FileAge(APath + AName) < OlderThan) and FOnlyNewer) or (not FOnlyNewer);

end;

HAb es einfach mal 1:1 kopiert... hoffe das hilft dir

EDIT:

Ach ja, schau dir mal den TSearchRec genauer an, da wirst du fast alles finden, was du brauchst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

FOnlyNewer wird von außerhalb gesetzt (globale Variable für das Formular) und hat wohl (wie man sich leicht denken kann ;) entweder den Wert True (dann werden nur neuere Dateien kopiert), oder eben False (dann werden immer alle kopiert).

wie gesagt: Schau dir TSearchRec an (Delphi besitzt eine sehr gute Online-Hilfe!). Da findest du alles, was du brauchst.


if (SR.Attr <> faDirectory) then

begin

...

Damit werden Verzeichnisse ausgeschlossen. Rate mal, was du tun musst um Verz. nicht auszuschliessen ;)

(Dafür muss das aber im Fall von SR.Attr = faDirectory rekurisv aufgerufen werden)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...