2016-06-30 8 views
4

OS: Windows Server 2012 R2 Standart FS: NTFSDatei Ctime verschiedene unter Perl 5 und Perl 6

=== perl5

e:\temporary>perl -v 
This is perl 5, version 22, subversion 0 (v5.22.0) built for MSWin32-x64-multi-thread 

e:\temporary>type ctime.pl 
use File::stat; 
use Time::Piece; 

my $fn1 = 't:\temporary\tia\Энергия\print.pdf'; 
my $fn2 = 't:\temporary\tia\Энергия\kl_to_1c.txt'; 
for ($fn1,$fn2) { 
    my $fs = stat($_); 
    print "$_\n"; 
    print 'changed ',gmtime($fs->ctime)->datetime,"\n"; 
    print 'modified ',gmtime($fs->mtime)->datetime,"\n"; 
    print 'accessed ',gmtime($fs->atime)->datetime,"\n"; 
} 

e:\temporary>perl ctime.pl 
t:\temporary\tia\Энергия\print.pdf 
changed 2016-07-01T03:48:22 <== (1) 
modified 2016-05-04T03:03:08 
accessed 2016-07-01T03:48:22 
t:\temporary\tia\Энергия\kl_to_1c.txt 
changed 2016-07-01T03:48:22 <== (3) 
modified 2016-07-01T03:11:00 
accessed 2016-07-01T03:48:22 

=== Perl6

e:\temporary>perl6 -v 
This is Rakudo version 2016.04 built on MoarVM version 2016.04 
implementing Perl 6.c. 

e:\temporary>type ctime.pl6 
use v6; 
my $fio1 = 't:\temporary\tia\Энергия\print.pdf'.IO; 
my $fio2 = 't:\temporary\tia\Энергия\kl_to_1c.txt'.IO; 

for $fio1,$fio2 { 
    say .path; 
    say 'changed ', .changed.DateTime.truncated-to('second'); 
    say 'modified ', .modified.DateTime.truncated-to('second'); 
    say 'accessed ', .accessed.DateTime.truncated-to('second'); 

} 

e:\temporary>perl6 ctime.pl6 
t:\temporary\tia\Энергия\print.pdf 
changed 2016-05-04T03:03:08Z <== (2) 
modified 2016-05-04T03:03:08Z 
accessed 2016-07-01T03:48:22Z 
t:\temporary\tia\Энергия\kl_to_1c.txt 
changed 2016-07-01T05:46:12Z <== (4) 
modified 2016-07-01T03:11:00Z 
accessed 2016-07-01T03:48:22Z 

Warum (1), (2) und (3), (4) sind unterschiedlich? Es ist OK?

Wiedergabe (1), (2).
1) Erstellen Sie die Datei mit dem Texteditor. Der Unterschied wird in Sekunden sein.
Von perl5:

changed 2016-06-30T16:38:42 
modified 2016-06-30T16:38:48 
accessed 2016-06-30T16:38:42 

Von Perl6:

changed 2016-06-30T16:38:48Z 
modified 2016-06-30T16:38:48Z 
accessed 2016-06-30T16:38:42Z 

2) Bearbeiten Sie diese einige Minuten später Datei. Der Unterschied wird auffälliger sein. Von perl5:

changed 2016-06-30T16:38:42 <== 
    modified 2016-06-30T16:49:17 
    accessed 2016-06-30T16:38:42 

Von Perl6:

changed 2016-06-30T16:49:17Z <== 
modified 2016-06-30T16:49:17Z 
accessed 2016-06-30T16:38:42Z 

'stat' von cgwin/babün

{ ~ } » stat t:/temporary/tia/Энергия/print.pdf            ~ 
    File: ‘t:/temporary/tia/Энергия/print.pdf’ 
    Size: 81595   Blocks: 80   IO Block: 65536 regular file 
Device: dfe235h/14672437d  Inode: 26458647810801926 Links: 1 
Access: (0644/-rw-r--r--) Uid: ( 500/Administrator) Gid: ( 513/Domain Users) 
Access: 2016-07-01 09:48:22.578784100 +0600 
Modify: 2016-05-04 09:03:08.602697600 +0600 
Change: 2016-05-04 09:03:08.602697600 +0600 
Birth: 2016-07-01 09:48:22.578784100 +0600 

{ ~ } » stat t:/temporary/tia/Энергия/kl_to_1c.txt           ~ 1 
    File: ‘t:/temporary/tia/Энергия/kl_to_1c.txt’ 
    Size: 4596   Blocks: 8   IO Block: 65536 regular file 
Device: dfe235h/14672437d  Inode: 24769797950537989 Links: 1 
Access: (0644/-rw-r--r--) Uid: ( 500/Administrator) Gid: ( 513/Domain Users) 
Access: 2016-07-01 09:48:22.563158800 +0600 
Modify: 2016-07-01 09:11:00.585249200 +0600 
Change: 2016-07-01 11:46:12.037712200 +0600 
Birth: 2016-07-01 09:48:22.563158800 +0600 
+1

Was ist das Ergebnis des Aufrufs des Befehls 'stat' in der Datei? –

+1

Ich aktualisierte das Beispiel mit UTC/GMT. Da Windows nicht 'stat' hat, haben die Daten mit cgwin/babun shell – sftf

+2

Die Dokumente für ['stat'] (http://perldoc.perl.org/functions/stat.html" perldoc -f stat ") erwähnen das 'ctime' ist nicht tragbar. Betrachtet man den ['stat'-Abschnitt von perlport] (http://perldoc.perl.org/perlport.html#stat), so heißt es, dass' ctime' die Erstellungszeit unter Windows ist. Es ist möglich, dass Rakudo etwas anderes macht, um tragbarer zu sein. (Es könnte auch ein Fehler sein) –

Antwort

3

Dies ist ein Fehler mit Ursprung in libuv sein kann (siehe: https://irclog.perlgeek.de/perl6/2016-07-11#i_12818620). Selbst wenn es so ist, sollte es nicht in Perl 6-Code fallen. Bitte reichen Sie einen Fehlerbericht gegen Rakudo ein (siehe: http://rakudo.org/tickets/).

+0

Huh .. Ich war mir sicher, dass Perl6 die richtigen Werte zurückliefert? Es scheint verschiedene Zeiten für 'Энергия \ kl_to_1c.txt' zurückzugeben, ganz zu schweigen davon, dass es mit Cygwins Stat-Ausgabe übereinstimmt. Vielleicht irre ich mich? –

+1

@Timbus In dieser Angelegenheit gibt es kein falsches oder richtiges. Es ist eine Frage der persönlichen Präferenz, wie diese 4 Zeitstempel auf den 3 Posix-Karten abgebildet werden. In Fällen, in denen es keinen guten Grund gibt, das Verhalten zwischen Perl 5 und Perl 6 zu ändern, wollen wir Perl 5 so nahe wie möglich bleiben, um den Port von 5 auf 6 zu portieren und Traps zu vermeiden, wenn Inline :: Perl5 verwendet wird. Auch der korrekte Weg in Perl 5 wäre, Win32API :: File :: Time zu verwenden. Das gleiche gilt für Perl 6 und Sie können dieses Modul gerne schreiben. :) –

+1

Fehlerbericht ist: https://rt.perl.org/Public/Bug/Display.html?id=128506 – sftf

Verwandte Themen