Veröffentlicht 12. Januar 200619 j 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;
12. Januar 200619 j 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.
12. Januar 200619 j Autor Die Funktion sollte nach Möglichkeit auch alle Unterverzeichnisse kopieren.
12. Januar 200619 j 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)
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.