ファイルハンドル$fh
があるとします。 -e $fh
でその存在を確認するか、-s $fh
または ファイルに関する追加情報 でそのファイルサイズを確認できます。最後に変更されたタイムスタンプを取得するにはどうすればよいですか?
組み込みモジュール_File::stat
_(Perl 5.004に含まれています)を使用できます。
stat($fh)
を呼び出すと、渡されたファイルハンドルに関する次の情報を含む配列が返されます( stat
のperlfunc manページから):
_ 0 dev device number of filesystem
1 ino inode number
2 mode file mode (type and permissions)
3 nlink number of (hard) links to the file
4 uid numeric user ID of file's owner
5 gid numeric group ID of file's owner
6 rdev the device identifier (special files only)
7 size total size of file, in bytes
8 atime last access time since the Epoch
9 mtime last modify time since the Epoch
10 ctime inode change time (NOT creation time!) since the Epoch
11 blksize preferred block size for file system I/O
12 blocks actual number of blocks allocated
_
この配列の要素番号9は、エポック以降の最終変更時刻を示します([1970年1月1日GMT)。それから現地時間を決定できます:
_my $Epoch_timestamp = (stat($fh))[9];
my $timestamp = localtime($Epoch_timestamp);
_
前の例で必要だったマジック番号9を避けるには、別の組み込みモジュール_Time::localtime
_を追加で使用します(Perl 5.004以降も含まれます) )。これには、いくつかの(おそらく)より読みやすいコードが必要です。
_use File::stat;
use Time::localtime;
my $timestamp = ctime(stat($fh)->mtime);
_
組み込みの stat 関数を使用します。または、より具体的に:
my $modtime = (stat($fh))[9]
my @array = stat($filehandle);
変更時刻は、Unix形式で$ array [9]に保存されます。
または明示的に:
my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
$atime, $mtime, $ctime, $blksize, $blocks) = stat($filepath);
0 dev Device number of filesystem
1 ino inode number
2 mode File mode (type and permissions)
3 nlink Number of (hard) links to the file
4 uid Numeric user ID of file's owner
5 gid Numeric group ID of file's owner
6 rdev The device identifier (special files only)
7 size Total size of file, in bytes
8 atime Last access time in seconds since the Epoch
9 mtime Last modify time in seconds since the Epoch
10 ctime inode change time in seconds since the Epoch
11 blksize Preferred block size for file system I/O
12 blocks Actual number of blocks allocated
エポックは1970年1月1日00:00 GMTでした。
詳細はstatにあります。
Stat呼び出しとファイル名が必要です:
my $last_mod_time = (stat ($file))[9];
Perlには異なるバージョンもあります。
my $last_mod_time = -M $file;
ただし、その値はプログラムが開始されたときからの相対値です。これは並べ替えなどに役立ちますが、おそらく最初のバージョンが必要です。
2つのファイルを比較してどちらが新しいかを確認する場合は、-C
が機能するはずです。
if (-C "file1.txt" > -C "file2.txt") {
{
/* Update */
}
-M
もありますが、あなたが望むものだとは思いません。幸いなことに、これらのファイル演算子に関するドキュメントをGoogle経由で検索することはほとんど不可能です。
Stat()またはFile :: Statモジュールを使用できます。
perldoc -f stat
stat
関数(_perldoc -f stat
_)を探していると思います
特に、返されるリストの9番目のフィールド(10番目、インデックス#9)は、エポック以降のファイルの最終変更時間(秒単位)です。
そう:
my $last_modified = (stat($fh))[9];
私の FreeBSD システムでは、stat
は単にblessを返します。
$VAR1 = bless( [
102,
8,
33188,
1,
0,
0,
661,
276,
1372816636,
1372755222,
1372755233,
32768,
8
], 'File::stat' );
次のようにmtime
を抽出する必要があります。
my @ABC = (stat($my_file));
print "-----------$ABC['File::stat'][9] ------------------------\n";
または
print "-----------$ABC[0][9] ------------------------\n";
これは非常に古いスレッドですが、このソリューションを使用しようとしましたが、File :: statから情報を取得できませんでした。 (Perl 5.10.1)
私は次のことをしなければなりませんでした:
my $f_stats = stat($fh);
my $timestamp_mod = localtime($f_stats->mtime);
print "MOD_TIME = $timestamp_mod \n";
他の誰かが同じトラブルを抱えていた場合に備えて、私は共有したいと思った。