Entwickler-Ecke

Dateizugriff - Datei erstell,Änderungs,zugriffsdatum abändern


Boller - Do 15.11.07 10:50
Titel: Datei erstell,Änderungs,zugriffsdatum abändern
Hallo,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.Button1Click(Sender: TObject);
var
  fh : THandle;
  fn : string;
  fCreationTime : FileTime;
  fLastAccessTime : FileTime;
  fLastWriteTime : FileTime;
  TempDateTime : TDateTime;
begin
  fn := 'c:\test.txt';
  fh := FileOpen(fn, fmOpenRead);
   GetFileTime(fh, @fCreationTime, @fLastAccessTime, @fLastWriteTime);
//   TempDateTime := FileTimeToDateTime(fLastWriteTime);

//  // Hier manipulieren der Wert ist beim Debuggen auch gleich dem anderen Datum

   fLastAccessTime := fLastWriteTime; //bis hier hin in Ordnung

   SetFileTime(fh, @fCreationTime, @fLastAccessTime, @fLastWriteTime);

   //Das Datum letzter Zugriff der Datei wird aber nicht abgeändert!

  CloseHandle(fh);



sieht jemand den Fehler und könnte mir den korrigierten Code Snippet dazu schreiben?



danke

Boller


Logikmensch - Do 15.11.07 11:05

Könnte vielleicht an dem Dateiattribut fmOpenRead liegen....

Aber zumindest sollte eine Fehlermeldung (Lasterror) stattfinden. Ich kann mir net vorstellen, dass dann einfach nichts passiert...


Boller - Do 15.11.07 11:28
Titel: hat funktioniert
fmOpenReadWrite dann funktioniert der Code


thx

Bolli


Boller - Do 15.11.07 11:48
Titel: muss doch noch einmal nachhaken
Hallo,

habe gemerkt das das mit dem Setfiletime funktioniert

aber das closehandle ändert vom System her selbst dass Zugriffsdatum.

Wie könnte man das Zugriffsdatum sonst noch ändern ohne die Systemzeit hin und her stellen zu müssen *g*


Boller - Do 15.11.07 14:19
Titel: Ändern des Zugriffs TimeStamp der Datei funktioniert gar nic
Hallo,

also das Ändern des Attributes der Datei "letzter Zugriff" kann man gar nicht abändern, oder?

Habe die Systemzeit sogar umgestellt auf die Datei zugegriffen und nach dem Close des Files die systemzeit zurück gestellt.

das Datum der Datei hat sich dabei mit umgestellt, obwohl das Handle der Datei schon weg war!

hmmm


Logikmensch - Fr 16.11.07 06:51

Hallo!

Das ging mir gestern auch durch den Kopf, als ich diesen Artikel las.
Die Information "letzter Zugriff" bedeutet doch, wann immer ein Programm (oder das System) mitunter auch lesend auf die Datei zugreift, wird diese Information geupdated. Also kann man es gar nicht verändern (schon ein Virenscan dürfte das bewirken).

Vielleicht sollte man erst einmal genau klären, was genau die einzelnen Datumsinformationen konkret bedeuten, die man da hat.

Auf der anderen Seite - warum sollte man es ändern. ;-)

Ich denke, dass es mehr Sinn macht, (wenn überhaupt was zu ändern), das Erstelldatum zu ändern.

Wenn es aber unbedingt sein muss, dann würde ich die Einträge der FAT32 bzw. NTFS-Dateitabelle(n) direkt auf der Festplatte verändern. Aber 1. weiß ich net, wie das gehen könnte und 2. sollte ein guter Virenscanner solche Dinge eh abblocken. :lol:


gispos - So 18.11.07 22:46

LastAccessTime zu ändern ist ohnehin keine gute Idee!
Unter WIN-XP und ??? kann der User diese Aktualisierung sogar abschalten (Speed). Und
somit wird dann LastAccessTime nie wieder aktualisiert.

Gruß gispos


Reinhard Kern - Mo 19.11.07 02:37

user profile iconLogikmensch hat folgendes geschrieben:
...
Vielleicht sollte man erst einmal genau klären, was genau die einzelnen Datumsinformationen konkret bedeuten, die man da hat.

Auf der anderen Seite - warum sollte man es ändern. ;-)

...


LastAccessTime ist eben die Last Access Time und wird folglich bei jedem Zugriff geändert, auch beim Lesen von LastAccessTime.

Bei Einführung hat MS irgendwo mal empfohlen (das findet sich sicher noch immer in den Tiefen des MSDN, aber keine Ahnung wo), dass speziell Programme, die LastAccessTime auslesen, und ebenso Backup-Software diesen Wert nach dem Zugriff auf den zuvor gelesenen Wert zurückstellen soll, damit diese Zugriffe "unsichtbar" bleiben. Soweit ich mich erinnern kann, sollte "dir" mit der entsprechenden Option sich auch so verhalten.

Zur Frage: man sollte es ändern, damit es sich nicht ändert :-)

Gruss Reinhard

PS: bei MS war von Systemprogrammen die Rede, möglicherweise sind besondere Rechte notwendig.

PS2: der Code war wohl schon richtig, folgendes ist Original MS:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
        static void touchFile(FileSystemInfo fsi)
        {
            Console.WriteLine("Touching: {0}", fsi.FullName);

            // Update the CreationTime, LastWriteTime and LastAccessTime.
            try
            {
                fsi.CreationTime = fsi.LastWriteTime = fsi.LastAccessTime =
                    DateTime.Now;
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }
        }


Moderiert von user profile iconNarses: Code- durch C#-Tags ersetzt