JoachimQ Geschrieben 12. Januar 2006 Geschrieben 12. Januar 2006 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; Zitieren
geloescht_JesterDay Geschrieben 12. Januar 2006 Geschrieben 12. Januar 2006 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. Zitieren
JoachimQ Geschrieben 12. Januar 2006 Autor Geschrieben 12. Januar 2006 Welchen Wert hat FOnlyNewer? Zitieren
JoachimQ Geschrieben 12. Januar 2006 Autor Geschrieben 12. Januar 2006 Die Funktion sollte nach Möglichkeit auch alle Unterverzeichnisse kopieren. Zitieren
geloescht_JesterDay Geschrieben 12. Januar 2006 Geschrieben 12. Januar 2006 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) Zitieren
Empfohlene Beiträge
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.