Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Windows 7 änderungsdatum (https://www.delphipraxis.net/157602-windows-7-aenderungsdatum.html)

rollstuhlfahrer 18. Jan 2011 13:52

AW: Windows 7 änderungsdatum
 
Zitat:

Zitat von WizoHulk (Beitrag 1075530)
Ich habe in ELOOffice meine Dokumente die er kopieren soll, aber bei übern nen paar hunder dokumente ist das warscheinlich mühsam jeden einzelnen Order durchzukämmen und zu schaun ob dort was neues hinzugekommen ist.

Das machen auch die professionellen Kopiertools wir RoboCopy und Co. Ich finde, das ist auf jeden Fall schneller als immer alles zu kopieren, wenn was neues da ist.

Bernhard

DeddyH 18. Jan 2011 13:56

AW: Windows 7 änderungsdatum
 
Das sage ich ja auch die ganze Zeit. Wer den verlinkten Wikipedia-Artikel gelesen hat, der weiß auch, dass das Archiv-Attribut ja extra für inkrementelle Sicherungen gedacht ist.

jobo 18. Jan 2011 14:07

AW: Windows 7 änderungsdatum
 
Zitat:

Zitat von WizoHulk (Beitrag 1075530)
Und bei meheren Verzeichnissen die er kopieren soll (z.b. D:\EloOffice, E:\Musik, F:\Bilder, ...)
Die zu kopierenden ordner wären Maximal 3 - 4 Gb groß.

Also falls das unklar ist, 3 Hauptverzeichnisse in Deinem Fall wären 3 Zeilen für xcopy (und wahrscheinlich auch robocopy), die Unterverzeichnisse durchsucht, vergleicht, kopiert xcopy dann auf Wunsch bzw. Befehl (Schalter /E oder so).

DeddyH 18. Jan 2011 15:23

AW: Windows 7 änderungsdatum
 
Und wenn es unbedingt mit Delphi sein muss, dazu habe ich mir mal ein paar Gedanken gemacht (VORSICHT: Code ist komplett ungetestet):
Delphi-Quellcode:
uses StrUtils;

procedure IncrementalBackup(SrcDir, DestDir: string; ErrorLog: TStrings;
  CopyEmptyDirs: Boolean = false);

  procedure Log(const Msg: string);
  begin
    if Assigned(ErrorLog) then
      ErrorLog.Add(Msg);
  end;

const
  faNewAnyFileEx = $00017FFF; // erweitertes faAnyFile aus der DP
  INVALID_DIRS =
    'Zielverzeichnis darf nicht im Quellverzeichnis enthalten sein';
var
  SearchRec: TSearchRec;
  DestPath: string;
  AttrCode: integer;
begin
  if AnsiContainsText(SrcDir, DestDir) then
    raise Exception.Create(INVALID_DIRS);
  SrcDir := IncludeTrailingPathDelimiter(SrcDir);
  DestDir := IncludeTrailingPathDelimiter(DestDir);
  if FindFirst(SrcDir + '*.*', faNewAnyFileEx, SearchRec) = 0 then
    try
      repeat
        if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          begin
            // Verzeichnis gefunden
            if (SearchRec.Attr and faDirectory) = faDirectory then
              begin
                DestPath := DestDir + SearchRec.Name;
                // ggf. anlegen
                if CopyEmptyDirs then
                  begin
                    if not(DirectoryExists(DestPath) or
                      ForceDirectories(DestPath)) then
                      Log(DestPath + ' konnte nicht angelegt werden.');
                  end;
                // Rekursiver Aufruf
                IncrementalBackup(SrcDir + SearchRec.Name, DestPath, ErrorLog,
                  CopyEmptyDirs);
              end
              // Datei gefunden
            else
              begin
                DestPath := DestDir + ExtractFilename
                  (ExcludeTrailingPathDelimiter(SrcDir));
                // nur bei gesetztem Archiv-Attribut oder wenn nicht vorhanden
                if ((SearchRec.Attr and faArchive) = faArchive) or
                  not FileExists(DestDir + SearchRec.Name) then
                  begin
                    // Zielverzeichnis ggf. anlegen
                    if not(DirectoryExists(DestPath) or
                      ForceDirectories(DestPath)) then
                      Log(DestPath + ' konnte nicht angelegt werden.')
                    else
                      begin
                        // Datei kopieren
                        if not CopyFile(PChar(SrcDir + SearchRec.Name),
                          PChar(DestPath + SearchRec.Name), false) then
                          Log(Format('%s: %s', [DestPath + SearchRec.Name,
                            SysErrorMessage(GetLastError)]))
                          // bei Erfolg Archiv-Attribut entfernen
                        else
                          begin
                            AttrCode := FileSetAttr(SrcDir + SearchRec.Name,
                              SearchRec.Attr and not faArchive);
                            if AttrCode <> 0 then
                              Log(Format('%s: %s', [DestPath + SearchRec.Name,
                                SysErrorMessage(AttrCode)]));
                          end;
                      end;
                  end;
              end;
          end;
      until FindNext(SearchRec) <> 0;
    finally
      SysUtils.FindClose(SearchRec);
    end;
end;
Ich hoffe, ich habe keinen groben Denkfehler gemacht, ansonsten bitte korrigieren.

[edit] Code nochmal durch den Formatter gejagt [/edit]

rollstuhlfahrer 18. Jan 2011 15:29

AW: Windows 7 änderungsdatum
 
Nein, Denkfehler habe ich keine gefunden, auch beim 2. Mal Drüberschauen wurde mir die Verwendung von CopyEmptyFiles klar.

Bernhard

DeddyH 18. Jan 2011 15:48

AW: Windows 7 änderungsdatum
 
Nun müsste man nur noch jemanden finden, der den Mut hat, das mal zu testen :roll:

Luckie 18. Jan 2011 18:10

AW: Windows 7 änderungsdatum
 
Zitat:

Zitat von DeddyH (Beitrag 1075574)
Nun müsste man nur noch jemanden finden, der den Mut hat, das mal zu testen :roll:

Früher mussten sich die Kanonengießer beim Einschießen der Kanone neben die selbige stellen, damit sichergestellt war, dass sie nicht absichtlich fehlerhaft gegossene Kanonen herstellen bzw. dass sie sich beim Gießen entsprechend Mühe gaben. :mrgreen:

DeddyH 19. Jan 2011 07:07

AW: Windows 7 änderungsdatum
 
[OT] Ich merke schon, der Luckie will mich loswerden :lol: [/OT]

WizoHulk 19. Jan 2011 09:01

AW: Windows 7 änderungsdatum
 
kann dein Code leider noch nicht testen, da viele Befehle Delphi 5 wohl nicht kennt, aber mit 2010 sollte das wohl gehen.

Luckie 19. Jan 2011 09:20

AW: Windows 7 änderungsdatum
 
Zitat:

Zitat von WizoHulk (Beitrag 1075743)
kann dein Code leider noch nicht testen, da viele Befehle Delphi 5 wohl nicht kennt, aber mit 2010 sollte das wohl gehen.

Das glaube ich nicht. Wahrscheinlich fehlen nur die zugehörigen Units.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 Uhr.
Seite 3 von 4     123 4      

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