Herausfinden wann eine Datei zuletzt geändert wurde [gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1619
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Herausfinden wann eine Datei zuletzt geändert wurde [gelöst]

Beitrag von corpsman »

Guten Morgen Allerseits,

Ich bastle gerade mal wieder an meinem Copy Commander herum.

Es geht darum eine Synchronisation von Verzeichnissen zu realisieren.

Im Prinzip habe ich auch schon alles fertig. Nur leider jedoch bekomme ich das Attribut "Letzte Dateiänderung" nicht so wie ich mir das vorstelle.

Was ich mache :
Ich suche Alle Dateien in einem Ordner und merke sie mir in einer Liste, Ebenfalls will ich mir den Zeitpunkt merken, zu dem die Datei zuletzt geändert wurde.
Später vergleiche ich diese beiden Zeitpunkte, sind sie ungleich, so ist eine Datei neuer, und diese wird dann mit der entsprechenden "Kopierrichtung" in eine Liste eingetragen.

Code: Alles auswählen

If FindFirst(Path1 + '*', faAnyFile, SR1) = 0 Then Begin
    Repeat
      If (SR1.Attr And FaDirectory = 0) Then Begin
        If (sr1.Name <> '.') And (sr1.Name <> '..') Then Begin
          setlength(info1, high(info1) + 2);
          info1[high(info1)].lastchanged := sr1.Time; // <-- Das scheint nicht die Richtige Zeit zu sein.
          info1[high(info1)].name := path1 + sr1.Name;
        End;
      End
    Until FindNext(SR1) <> 0;
    FindClose(SR1);
  End;
Das Problem ist nun, dass sr1.time nicht die Richtige Zeit zu sein scheint, leider jedoch gibt es keine andere Zeit die ich auslesen kann. Zumindest nicht so,
GetFileDate habe ich auch schon Probiert, doch das liefert mir immer die Selben Werte wie sr1.time.

in meiner Kopier Routine achte ich darauf dass ich das Dateidatum auch mit kopiere :

Code: Alles auswählen

..
      FileSetDate(fDst, FileGetDate(fSrc));
      FileClose(fDst);
      FileSetAttr(dest, FileGetAttr(source));
      FileClose(fSrc);
..
Jedoch steht im entsprechenden Teil in der Sysutils :

Code: Alles auswählen

Function FileSetDate (Handle,Age : Longint) : Longint;
 
begin
  // Impossible under Linux from FileHandle !!
  FileSetDate:=-1;
end;
Was mich shcon ein wenig stutzig macht, will man das glaube was da steht, so liegt es hierran. Die Frage mus nun also lauten.

Kann ich das FileSetDate irgendwie doch noch realisieren ?
Zuletzt geändert von corpsman am Mo 1. Mär 2010, 16:37, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Herausfinden wann eine Datei zuletzt geändert wurde..

Beitrag von theo »

Vielleicht klappt das mit fpstat besser:

if fpstat ('test.txt',info)=0 then Caption:=DateTimeToStr(FileDateToDateTime(info.atime));

etc.
http://www.freepascal.org/docs-html/rtl ... /stat.html" onclick="window.open(this.href);return false;

Zum ändern musst du vllt. "touch" aufrufen.
http://www.computerhope.com/unix/utouch.htm" onclick="window.open(this.href);return false;
Zuletzt geändert von theo am Mo 1. Mär 2010, 16:10, insgesamt 1-mal geändert.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1619
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Herausfinden wann eine Datei zuletzt geändert wurde..

Beitrag von corpsman »

was ist "Touch" ?

Ich hab mir grad mal die Properties der "Kopierten" Dateien angesehen, da sieht man es auch deutlich.

Die Properties werden nicht richtig gesetzt. Die Lösung meiens Problems liegt also in der Antwort auf die Frage :

Wie setzt man :

Code: Alles auswählen

FileSetDate(fDst, FileGetDate(fSrc));
      FileClose(fDst);
      FileSetAttr(dest, FileGetAttr(source));
      FileClose(fSrc);
unter Linux Richtig um ?
--
Just try it

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Herausfinden wann eine Datei zuletzt geändert wurde..

Beitrag von theo »

corpsman hat geschrieben:was ist "Touch" ?
Yawn... ;-) Habe oben den Link noch eingebaut.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1619
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Herausfinden wann eine Datei zuletzt geändert wurde..

Beitrag von corpsman »

Ach du Schreck,

das ist dein Ernst ?

Ich muss nun also einen TProcess machen, der dann als Commandline den Touch Aufruf bekommt ?

Und das geht echt nicht "Eleganter" ?
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1619
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Herausfinden wann eine Datei zuletzt geändert wurde..

Beitrag von corpsman »

Hier für die Nachwelt :

Code: Alles auswählen

Procedure SetFileAge(Filename: String; Age: Longint);
Var
  s: String;
  p: TProcess;
Begin
  p := TProcess.create(nil);
  s := FormatDateTime('YYYYMMDDhhmm.ss', FileDateToDateTime(age));
  p.CommandLine := 'touch -t ' + s + ' "' + filename + '"';
  //p.Options := p.Options; // <-- hier könnte noch ein  +[poWaitOnExit] stehen, dann wartet die Anwendung hier Explizit
  p.Execute;
  p.free;
End;
Zuletzt geändert von corpsman am Di 2. Mär 2010, 07:12, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Herausfinden wann eine Datei zuletzt geändert wurde..

Beitrag von theo »

corpsman hat geschrieben: Und das geht echt nicht "Eleganter" ?
Unter Linux ist das aufrufen externer Prozesse keine Erbsünde. ;-)

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Herausfinden wann eine Datei zuletzt geändert wurde..

Beitrag von Socke »

corpsman hat geschrieben:

Code: Alles auswählen

p.Options := p.Options;
Kann mir jemand erklären was das bewirken soll?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Herausfinden wann eine Datei zuletzt geändert wurde..

Beitrag von theo »

Socke hat geschrieben:
corpsman hat geschrieben:

Code: Alles auswählen

p.Options := p.Options;
Kann mir jemand erklären was das bewirken soll?
Tja, also das weist gewissermassen p.Options den p.Options zu.
Das ergibt hier jetzt wahrscheinlich nicht so recht viel Sinn.
Es kann aber schon mal sein, dass das Sinn ergibt. Z.B. bei einer schlecht designten Klasse kann sowas schon mal ein Update/Refresh auslösen, welches sonst nicht erreichbar ist.
Oder so.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1619
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Herausfinden wann eine Datei zuletzt geändert wurde [gelöst]

Beitrag von corpsman »

*g*

hier ist das Schwachsinn,

Ursprünglich stand da :

Code: Alles auswählen

p.Options := p.Options + [poWaitOnExit];
ich habe zwar das powait gelöscht, aber in der kürze übersehen, dass man das gesamte statement löschen könnte.

Übrigens, kann es sein, dass die getFileAge funktion nicht richtig funktioniert, wenn man sie von einer Datei abfrägt, die auf einem Windows Netzwerklaufwerk liegt ?
--
Just try it

Antworten