Delphi-PRAXiS

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)

WizoHulk 18. Jan 2011 07:37

Windows 7 änderungsdatum
 
Hallo,

ich habe ein kleines Problem, und zwar will ich mir eine kleine Anwendung zusammen basteln die Ordner auf das Änderungsdatum prüft.
Soooooo...
Unter Windows XP ist das kein Ding, wenn ich den Verzeichniss sich was getan hat wir das Datum geändert.
Aber unter Windows 7 ändert sich da gar nichts.
Was kann ich da machen.

Oder gibt es noch andere möglichkeiten einen Ordner auf

himitsu 18. Jan 2011 08:09

AW: Windows 7 änderungsdatum
 
Es kann sein, daß dieses einfach nicht mehr geändert wird.

Ändern kannst du daran nichts, da dieses ein Verhalten des Dateisystemtreibers ist und wenn er es nicht mehr macht, dann ist das halt so.


Zitat:

ftLastWriteTime

For a directory, the structure specifies when the directory is created. If the underlying file system does not support last write time, this member is zero.
http://msdn.microsoft.com/en-us/library/aa365740.aspx

WizoHulk 18. Jan 2011 08:44

AW: Windows 7 Änderungsdatum
 
hmmmm das ist ja echt schade...
Kann mann das nicht in der regestry einstellen?
Aber wenn es nicht geht, dann hat ja das änderungsdatum der ordner keine Bewandnis für den User und könnte dann komplett raus genommen werden.
Das sind ja dann alles falsche Datumswerte woran man sich nicht halten kann.

Luckie 18. Jan 2011 08:46

AW: Windows 7 änderungsdatum
 
Was erwartest du da für ein Datum? Ein Ordner wird erstellt. Und wann ändert sich ein Ordner?

Und wozu brauchst du das?

himitsu 18. Jan 2011 08:55

AW: Windows 7 änderungsdatum
 
Früher (ich glaub noch unter XP), bzw. in den ersten Versionen der NTFS- und FAT-Treiber stand da drin, dann die Zeit, als sich zuletzt etwas in diesem Ordner veränderte (Dateien erstellt, geändert oder gelöscht).

xaromz 18. Jan 2011 08:58

AW: Windows 7 änderungsdatum
 
Hallo,

Für Dein Problem gibt es eine Windows-Funktion: Du kannst Dich mit MSDN-Library durchsuchenFindFirstChangeNotification einfach benachrichtigen lassen, wenn sich was ändert.

Gruß
xaromz

WizoHulk 18. Jan 2011 09:09

AW: Windows 7 änderungsdatum
 
ich schreibe grad ein programm was ganz simpel bloß ordner von Punkt A nach Punkt B kopiert und
das programm in den Autostart geschoben wird.
Dadurch startet die Anwendung jedes mal wenn auch windows gestartet wird und somit wird ohne eine Prüfung, ob sich was in den Ordner A was getan hat, nach Punkt B Kopiert.
Und mit dem Änderungsdatum wollte ich es Unterbinden das er jedes mal kopiert ohne das sich was geändert hat.

Bummi 18. Jan 2011 09:13

AW: Windows 7 änderungsdatum
 
Wenn Du Dich auf Dateiebene begibst???

WizoHulk 18. Jan 2011 09:25

AW: Windows 7 änderungsdatum
 
in den meisten fällen sind es bei mir nur Ordner und bei Dateien müsste ich jedes mal nachschaun ob eine neue Datei hinzugekommen ist.
Weiß net ob das so die Lösung ist.

Die Anwendung soll mir bloß daten wegsichern. zb. Ordner mit Dokumenten oder Bilder
von d:\Bilder nach f:\Bilder Backup\

DeddyH 18. Jan 2011 09:59

AW: Windows 7 änderungsdatum
 
Wieso wertest Du nicht einfach das Archiv-Attribut aus, dazu ist es ja da?

WizoHulk 18. Jan 2011 10:06

AW: Windows 7 änderungsdatum
 
Archiv Attribut kenne ich nicht, noch nie von gehört.
Hast du nen Link wo das gut erklärt wird?

Soll das etwa das Häckchen sein, was man bei den Ordner einstellungen macht?

DeddyH 18. Jan 2011 10:08

AW: Windows 7 änderungsdatum
 
Delphi-Referenz durchsuchenTSearchRec, da dann die Beschreibung zum Attr-Feld

[edit] Das ist kein "Häkchen". Beschreibung auf Wikipedia [/edit]

WizoHulk 18. Jan 2011 11:34

AW: Windows 7 änderungsdatum
 
ich habe jetzt diesen Quellcode gefunden, haut auch soweit hin alles, was ich jetzt aber net
ich kann aber damit doch nicht überprüfen, ob was neues in den Ordner verändert wurde.

Oder doch?

jetzt bin ich verwirrt...
Delphi-Quellcode:
function TForm1.GetFileAttributes(const FileName: string): TFileAttributes;
var srec: TSearchRec;
begin
  result:=[];
  if FindFirst(FileName, faDirectory, srec) = 0 then begin
    try
      if (srec.Attr and faReadOnly)>0 then result:=result+[ReadOnly]; //Schreibgesch. Datei 1
      if (srec.Attr and faHidden)>0 then result:=result+[Hidden]; //Verborgene Datei
      if (srec.Attr and faSysFile)>0 then result:=result+[SysFile]; //Systemdatei
      if (srec.Attr and faVolumeId)>0 then result:=result+[VolumeId]; //Laufwerks-ID
      if (srec.Attr and faDirectory)>0 then result:=result+[Directory]; //Verzeichnis
      if (srec.Attr and faArchive)>0 then result:=result+[Archive]; //Archivdatei
      if (srec.Attr and faAnyFile)>0 then result:=result+[AnyFile]; //Beliebige Datei
    finally
      FindClose(srec);
    end;
  end;
end;




procedure TForm1.Button1Click(Sender: TObject);
var
   fa: TFileAttributes;
begin
  fa:=GetFileAttributes('C:\Dokumente und Einstellungen\benutzer\Desktop\Neuer Ordner');
  if Archive in fa then
    ShowMessage('Archiviert')
  else
    ShowMessage('Nicht Archiviert');
end;

Coder 18. Jan 2011 11:52

AW: Windows 7 änderungsdatum
 
mhh, ja ich weiß nicht...
also Du hast eine FESTGELEGTE LISTE von Ordnern (also, man kann einstellen, welche Ordner incl. Unterordnern "überwacht" werden sollen?).
Dann lies doch auch das Datum und die Zeit der zum letzten Sicherungspunkt existenten Unter-Ordner dazu aus und speichere das mit in einer kleinen Textdatei

C:\EigeneDateien\dämlicheFotos, 07.01.2011, 13:44
C:\EigeneDateien\peinlicheFotos, 07.01.2011, 16:23
C:\EigeneDateien\Delphiprogramme, 018.01.2011, 09:17

und bei den Dateien mußte das auch jeweils machen.
je Unterordner/pfad.

und dann bei jedem Start abgleichen.


mhh, wie? unter win7 wird das Änderungsdatum der Ordner nicht mehr aktualsiert, nachdem eine Datei darin erzeugt/gelöscht/kopiert,/Verändert (größe) wurde?

Anm.: die Zeit der nächst darüberligenden Ordner wird nicht verändert, wenn in einem Unterordner eine Datei verändert wird. Das ist auch unter XP schon so, soweit ich feststellen konnte.
Dagegen hilft nur scannen der Ordner auf Dateien und vergleich mit der o.g. Liste.

DeddyH 18. Jan 2011 12:09

AW: Windows 7 änderungsdatum
 
Man kann doch rekursiv das Verzeichnis durchlaufen und die enthaltenen Dateien daraufhin prüfen, ob das Archiv-Attribut gesetzt ist. Falls ja, Datei kopieren und Archiv-Attribut wieder entfernen.

WizoHulk 18. Jan 2011 13:12

AW: Windows 7 änderungsdatum
 
hmmmmm..
also ist das Archiv attribut nur für dateien und nicht für ordner.

eine schöne lösung ist das ja nicht jeden einzelnen

jobo 18. Jan 2011 13:15

AW: Windows 7 änderungsdatum
 
Wie wär es dennn ohne Programmierung mit Bordmitteln?
Code:
V:\>help xcopy
Kopiert Dateien und Verzeichnisstrukturen.

XCOPY Quelle [Ziel] [/A | /M] [/D[:Datum]] [/P] [/S [/E]] [/V] [/W]
                    [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
                    [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]
                    [/EXCLUDE:Datei1[+Datei2][+Datei3]...]

  Quelle   Die zu kopierenden Dateien.
  Ziel     Position und/oder Name der neuen Dateien.
[B] /A       Kopiert nur Dateien mit gesetztem Archivattribut,
            ändert das Attribut nicht.
  /M       Kopiert nur Dateien mit gesetztem Archivattribut,
            setzt das Attribut nach dem Kopieren zurück.[/B]
Oder gibt es das unter Windows 7 (home, ...) nicht mehr?

DeddyH 18. Jan 2011 13:17

AW: Windows 7 änderungsdatum
 
Wieso ist das keine schöne Lösung? Willst Du einen Ordner mit 100 GB kopieren, nur weil eine Datei mit 100 KB dazugekommen ist?

[edit] Unter Vista/Win7 gibt es Robocopy, das ist noch einen Tacken ausgefuchster. [/edit]

jobo 18. Jan 2011 13:34

AW: Windows 7 änderungsdatum
 
Robocopy kenne ich nicht, aber wenn ich WizoHulk richtig verstanden habe, reicht eine Zeile xcopy (oder mehrere, wenn es verschiedene Verzeichnisse sind)
Man muss sich ja nicht unnötig quälen. :roll:

WizoHulk 18. Jan 2011 13:40

AW: Windows 7 änderungsdatum
 
hmmm habe mir grad ma was zu hashwerten angeschaut, das scheint aber auch net die richtige lösung zu sein.

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.

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ß.

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.

WizoHulk 19. Jan 2011 09:26

AW: Windows 7 änderungsdatum
 
bei der unit StrUtils meckert er rum das er die nicht finden kann.

Laut Google gab es noch keine StrUtils unter D5.

DeddyH 19. Jan 2011 09:41

AW: Windows 7 änderungsdatum
 
Das wird wohl unter Delphi 5 tatsächlich nicht gehen, allein schon, weil IncludeTrailingPathDelimiter unbekannt sein dürfte.

WizoHulk 20. Jan 2011 07:28

AW: Windows 7 änderungsdatum
 
Hallo DeddyH,

Mit deinem Code klappt alles Prima, muss mir den aber noch mal genauer anschaun, da so einige sachen dran sind die ich nicht so ganz verstehe. Danke

Wofür ist die Anweisung
Delphi-Quellcode:
CopyEmptyDirs: Boolean = false
Und was macht das?
Delphi-Quellcode:
 faNewAnyFileEx = $00017FFF; // erweitertes faAnyFile aus der DP
werd da nicht ganz schlau drauß

Ist es möglich eine Progressbar zu Integrieren, das ich mir den Vortschritt anzeigen lassen kann.

DeddyH 20. Jan 2011 07:32

AW: Windows 7 änderungsdatum
 
CopyEmptyDirs ist dafür da, dass man auf Wunsch auch leere Verzeichnisse kopieren kann. Und die Konstante ist lediglich eine Erweiterung für faAnyfile, welches z.B. komprimierte Dateien nicht berücksichtigt. In der erweiterten Konstanten sollten alle derzeit bekannten Dateiattribute enthalten sein.

[edit] Zur Progressbar: Das dürfte schwierig werden, da Du im Vorfeld ermitteln müsstest, wieviele Dateien tatsächlich kopiert werden müssen. Aufgrund dieses Wertes könntest Du ja erst den prozentualen Anteil des aktuellen Kopiervorganges ermitteln. Allerdings kann man natürlich eine Progressbar im Marquee-Style anzeigen, um dem Benutzer zu signalisieren, dass etwas passiert. [/edit]

WizoHulk 20. Jan 2011 07:57

AW: Windows 7 änderungsdatum
 
ja so in etwa hatte ich mir das schon gedacht das das nicht so einfach geht, also werd ich im Vorfeld Die Dateianzahl ermitteln müssen.
Dürfte ja da mit den Quellcode gehen
Delphi-Quellcode:
class function TMyDaten.ErmittleArchivAttribut(Verzeichnis: String): TStringList;
var
  Search : TSearchRec;
  LVerz  : String;
  LNamen : TStringList;
begin
  LNamen := TStringList.Create;

  LVerz := Verzeichnis;
  if FindFirst(LVerz + '*.*', faAnyFile or faArchive, Search) = 0 then
    try
      repeat
        if (Search.Attr and faArchive) = faArchive then
          LNamen.Add(Search.Name)
      until
        FindNext(Search) <> 0;
    finally
      SysUtils.FindClose(Search);
      Result := LNamen;
    end;
  //LNamen.Free;
end;

ChrisE 20. Jan 2011 07:58

AW: Windows 7 änderungsdatum
 
Zitat:

Zitat von WizoHulk (Beitrag 1075981)
Ist es möglich eine Progressbar zu Integrieren, das ich mir den Vortschritt anzeigen lassen kann.

Das wäre möglich wenn du die Routine in zwei Bereiche auf teilst.

Erster Teil entspricht nahezu dem Code von DeddyH. Während dessen läuft wie von Ihm vorgeschlagen ein Progressbar in Marquee-Style. Nur werden hier weder Dateien kopiert noch Verzeichnisse erstellt. Es wird nur z.B. eine StringListe mit den zu kopierenden Dateien erstellt und eine StringListe mit dem evtl. zu erstellenden EmptyDirs.

Im zweiten Schritt kannst du dann alle Dateien kopieren und die Verzeichnisse erstellen. Da du die Anzahl der Dateien / Verzeichnisse kennst, kannst du einen Gesamtfortschritt anzeigen.

Wenn du es noch etwas besser haben willst, dann merkst du dir zusätzlich zu den Dateinamen auch noch deren Größe und passt den Gesamtfortschritt nicht nach der Anzahl der Dateien an sondern nach den zu kopierenden Bytes :-) Das wäre dann aber eher eine Kür - kann aber praktisch sein, da beim kopieren ja auch durchaus deutlich unterschiedlich große Dateien dabei sein können.

Gruß, Chris

DeddyH 20. Jan 2011 08:05

AW: Windows 7 änderungsdatum
 
Genauso hatte ich mir das auch gedacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.

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