myUtils: Zeitpunkt der letzten Änderung von Datei ermitteln

Begonnen von yersinia, 02 Februar 2024, 08:33:51

Vorheriges Thema - Nächstes Thema

TomLee

#15
@yersinia

Auf die Gefahr hin das ich nicht alles richtig verstanden habe was genau gewünscht ist:
Wäre es nicht auch einfach OK stat mit der Option %Z zu verwenden, welche die Epoch-Sekunden zurückgibt ?
Nur die benötigt man doch zur weiteren Verwendung in einer myUtils ? Oder geht es darum, auf möglichst kürzestem Weg, genau das Zeitformat %Y-%m-%d_%H-%M-%S zu erhalten um das irgendwo auszugeben ?
sub fupy {
my $t = system("stat -c '%Z' testjson.json");
return $t;
}



betateilchen

#16
warum sollte man das auf Betriebssystemebene machen, wo doch stat() eine perl Standardfunktion ist?

(stat("fileName"))[9]
liefert auch die Sekunden zurück, die man dann beliebig formatieren kann.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

yersinia

Ich benötige den Zeitpunkt der letzten Änderung um diesen dann weiter verarbeiten zu können; am liebsten als DateTime-Objekt - das Zielformat ist
%Y%m%dT%H%M%S
Allerdings bekomme ich mit
my $t = system("stat -c '%Z' www/test.txt");nur den Rückgabewert -1.

Zitat von: betateilchen am 02 Februar 2024, 16:41:03warum sollte man das auf Betriebssystemebene machen, wo doch stat() eine perl Standardfunktion ist?
Davon abgesehen. Ich gehe davon aus, dass perl auch im FHEM-Kontext fähig ist, Metainformationen einer Datei abzufragen.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

betateilchen

Zitat von: yersinia am 02 Februar 2024, 16:43:11Davon abgesehen. Ich gehe davon aus, dass perl auch im FHEM-Kontext fähig ist, Metainformationen einer Datei abzufragen.

Natürlich - siehe die Ergänzung in meinem letzten Beitrag.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

yersinia

Wo wir wieder hier wären:
Zitat von: yersinia am 02 Februar 2024, 12:37:18stat($filename)[9]scheint undef zurückzugeben:
DateTime::_check_from_epoch_params('epoch', undef, 'time_zone', 'local') called at /usr/lib/aarch64-linux-gnu/perl5/5.32/DateTime.pm line 481
DateTime::from_epoch('DateTime', 'epoch', undef, 'time_zone', 'local') called at FHEM/99_myUtils.pm line 41
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

betateilchen

#20
Logisch, das ist ja auch falsch. Es muss

(stat($filename))[9]
heißen. stat() liefert ein array, Du willst aus dem array das Element 9 haben. Also musst Du auch das array korrekt übergeben, wenn Du es nicht einer Variablen zuweisen möchtest. Deshalb die zusätzlichen Klammern (die übrigens auch in meinem Codebeispiel stehen !)



Aber...

Zitat von: yersinia am 02 Februar 2024, 16:43:11Ich benötige den Zeitpunkt der letzten Änderung um diesen dann weiter verarbeiten zu können; am liebsten als DateTime-Objekt - das Zielformat ist
%Y%m%dT%H%M%S

Das ist doch noch einfacher zu lösen:

sub test {
  my $filename = "./fhem.pl";
  return POSIX::strftime("%Y%m%dT%H%M%S",localtime((stat($filename))[9]));
}

liefert

20240129T195015
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#21
Zitat von: yersinia am 02 Februar 2024, 16:43:11Allerdings bekomme ich mit
Code Auswählen Erweitern

my $t = system("stat -c '%Z' www/test.txt");nur den Rückgabewert -1.

Du musst im Log schauen.



sub test {
  my $filename = "./fhem.pl";
  return POSIX::strftime("%Y%m%dT%H%M%S",localtime((stat($filename))[9]));
}

Und was ist hier jetzt der Grund dafür das man das POSIX:: vor strftime weglassen kann ?

betateilchen

Zitat von: TomLee am 02 Februar 2024, 17:27:53Und was ist hier jetzt der Grund dafür das man das POSIX:: vor strftime weglassen kann ?

Das ist nicht ganz die passende Frage.

Die richtige Frage wäre, warum ich das POSIX:: hier explizit angegeben habe.
Antwort: ich bin für klare Verhältnisse, deshalb gebe ich an, aus welchem Modul ich die Funktion strftime() haben möchte, für den Fall, dass es die Funktion in mehreren Modulen oder z.B. in der 99_myUtils.pm geben könnte.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

OK, vielen Dank.


Zitatstat() liefert ein array, Du willst aus dem array das Element 9 haben. Also musst Du auch das array korrekt übergeben, wenn Du es nicht einer Variablen zuweisen möchtest. Deshalb die zusätzlichen Klammern

Und ich verstehe aber immer noch nicht warum man sich die Sekunden nicht ausgeben lassen kann (einfach nur zum nachvollziehen), es klappt nicht mit Debug, und auch nicht wenn ich es in einer Variablen festhalten möchte, nur als Parameterübergabe in dem strftime.
Bspw. beim schnell ausprobieren in der Befehlszeile, das gleiche gilt aber auch in der myUtils:
{my $t=(stat('./fhem.pl'))[9];;return $t;;}
{my $t=(stat('./fhem.pl'))[9];;Debug $t;;}

betateilchen

Zitat von: TomLee am 02 Februar 2024, 17:58:06Und ich verstehe aber immer noch nicht warum man sich die Sekunden nicht ausgeben lassen kann

Bei mir funktioniert das einwandfrei.

In die Befehlszeile eingegeben

{my $t=(stat('./fhem.pl'))[9];;return $t;;}
erhalte ich als Antwort im Frontend

1706554215
Deine Zeile mit Debug funktioniert bei mir genauso fehlerfrei:

2024.02.02 18:03:49 1: DEBUG>1706554215
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Bei mir funzt das nicht, weder am Laptop, noch jetzt wo ich es nochmal am Tablet ausprobiert habe, nachdem du geschrieben hast.

Am allgemeinen Zustand kanns auch nicht liegen, das Fläschchen Bier hab ich eben erst aufgemacht.

TomLee

#26
Anbei der Nachweis...

sub fupy {
  #my $filename = "./fhem.pl";
  #return strftime("%Y%m%dT%H%M%S",localtime((stat($filename))[9]));
  my $t=(stat('./fhem.pl'))[9];
  Debug $t;
  return $t;
}



Ja ich weiß das es jetzt was von OT hat, evtl. aber auch nicht.

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Ich sag mal so, sicher kannst auch du es bei Dir genauso nachvollziehen:

Wenn man "oben" in der myUtils:
use File::stat;
use Time::Piece;
use DateTime;
zusätzlich angegeben hat  ::) , dann kommt es genau zu meinem geschilderten Verhalten.
Nimmt man das wieder raus und macht einen restart, dann ist das Elend vorbei  ;)

betateilchen

Zitat von: TomLee am 02 Februar 2024, 20:30:04Wenn man "oben" in der myUtils:
use File::stat;

Natürlich funktioniert es dann NICHT.
Das brauche ich gar nicht nachvollziehen, das steht sogar ausdrücklich in der Beschreibung zu File::stat.

ZitatThis module's default exports override the core stat() and lstat() functions, replacing them with versions that return "File::stat" objects.

Das heißt doch eindeutig: die Sache mit dem array funktioniert dann nicht mehr, weil es gar kein array mehr als Rückgabewert gibt.

Aber davon, dass diese Dinge bei Dir explizit angegeben sind, war bisher nirgends die Rede.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!