CGI-BBS > CGI > Perl > ファイルの更新日付


カレッヂ
カレッヂ


質問者 たぬぽん  投稿日 2/27(火) 10:43:01
質問させて下さい。
こちらんのサーバではSSIが使用できません。

ファイルが更新された日付を取得してHTMLで表示させたいのですが、どのようにしたら良いのでしょうか?
QUERY_STRINGとかの環境変数を使用するのかと思いますがいまいちよく分かりません。
また、複数のファイルの一番最新の日付を取得するにはどのようにしたらよいのでしょうか?
どうかご指導お願いします。

例)
本部長室 2001/02/27
   :
   :
   :
企画室   2001/01/10
回答者 さくら  [削除]  投稿日 2/28(水) 02:56:48
まず、ファイルの最終更新時刻を調べる方法について。

ファイルテスト演算子    -M 'filename'
stat 関数              (stat 'filename')[9]

このような調べ方がある。
ファイルテスト演算子は、更新されてからの日数を返す。
stat 関数は、更新された時のtime つまり1970/1/1からの秒数を返す。

例えば、testfile というファイルがあるとします。
最終更新時刻は、2001/2/17/(土)21:17:12 だとします。
$filename = 'testfile';
print scalar localtime((stat $filename)[9]);
こうすると下記のようにprint されます。

Sat Feb 17 21:17:12 2001

貴方が望むフォーマットに変換するには  >2001/02/17 これです。

($min,$sec,$hour,$day,$month,$year) = localtime((stat $filename)[9]);
$year += 1900;
$month++;
print $filename, ":  ", sprintf ("%0.4d/%0.2d/%0.2d",  $year,$month,$day);

これで、testfile:  2001/02/17  とprintされます。

このように、更新時刻を取得できますが、今回はソートもしなければなりませんので、
下記に、サンプルのコードを示します。

ちょっと、難しいかもしれませんが、このままでも使えますし、利用方法に合わせてカスタマイズして下さい。
流れを説明します。
1.  カレントディレクトリをopenします。
2.  必要なファイルを配列に格納します。(ここでは、html htm ファイルを抜き出します)
3.  ファイルテスト演算子を使ってソートして、配列に格納します。
4.  表示用にフォーマットして、"ファイル名:  更新日" のようにprintします。

opendir DIR, "." or die;
@htmlarray = grep { /\.html?$/ }(readdir DIR);
@sortedNames = map{ $_->[0] } sort{ $a->[1] <=> $b->[1] } map{ [$_, -M] } @htmlarray;
foreach (@sortedNames){
        ($min,$sec,$hour,$day,$month,$year) = localtime((stat $_)[9]);
        $year += 1900;
        $month++;
        print $_, ":  ", sprintf ("%0.4d/%0.2d/%0.2d",  $year,$month,$day), "\n";
}
close DIR;

以上です。がんばって下さい。



質問者 たぬぽん  [削除]  投稿日 2/28(水) 15:53:54
ありがとうございました!!

stat関数の存在すら...。(*^_^*)
また、ご指よろしくお願いします。

このページは終了したので返信(回答)は書きこめません

Web裏技