![]() |
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 |
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:
![]() |
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. |
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? |
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).
|
AW: Windows 7 änderungsdatum
Hallo,
Für Dein Problem gibt es eine Windows-Funktion: Du kannst Dich mit ![]() Gruß xaromz |
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. |
AW: Windows 7 änderungsdatum
Wenn Du Dich auf Dateiebene begibst???
|
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\ |
AW: Windows 7 änderungsdatum
Wieso wertest Du nicht einfach das Archiv-Attribut aus, dazu ist es ja da?
|
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? |
AW: Windows 7 änderungsdatum
![]() [edit] Das ist kein "Häkchen". ![]() |
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; |
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. |
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.
|
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 |
AW: Windows 7 änderungsdatum
Wie wär es dennn ohne Programmierung mit Bordmitteln?
Code:
Oder gibt es das unter Windows 7 (home, ...) nicht mehr?
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] |
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] |
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: |
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ß. |
AW: Windows 7 änderungsdatum
Zitat:
Bernhard |
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.
|
AW: Windows 7 änderungsdatum
Zitat:
|
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:
Ich hoffe, ich habe keinen groben Denkfehler gemacht, ansonsten bitte korrigieren.
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; [edit] Code nochmal durch den Formatter gejagt [/edit] |
AW: Windows 7 änderungsdatum
Nein, Denkfehler habe ich keine gefunden, auch beim 2. Mal Drüberschauen wurde mir die Verwendung von CopyEmptyFiles klar.
Bernhard |
AW: Windows 7 änderungsdatum
Nun müsste man nur noch jemanden finden, der den Mut hat, das mal zu testen :roll:
|
AW: Windows 7 änderungsdatum
Zitat:
|
AW: Windows 7 änderungsdatum
[OT] Ich merke schon, der Luckie will mich loswerden :lol: [/OT]
|
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.
|
AW: Windows 7 änderungsdatum
Zitat:
|
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. |
AW: Windows 7 änderungsdatum
Das wird wohl unter Delphi 5 tatsächlich nicht gehen, allein schon, weil IncludeTrailingPathDelimiter unbekannt sein dürfte.
|
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:
Und was macht das?
CopyEmptyDirs: Boolean = false
Delphi-Quellcode:
werd da nicht ganz schlau drauß
faNewAnyFileEx = $00017FFF; // erweitertes faAnyFile aus der DP
Ist es möglich eine Progressbar zu Integrieren, das ich mir den Vortschritt anzeigen lassen kann. |
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] |
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; |
AW: Windows 7 änderungsdatum
Zitat:
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 |
AW: Windows 7 änderungsdatum
Genauso hatte ich mir das auch gedacht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz