ファイルの日付取得

このQ&Aのポイント
  • Perl/CGIでファイルの日付取得について悩んでいます。正しくファイルの最終更新日付を表示する方法を教えてください。
  • Perl/CGIでサーバ上の特定フォルダ内の.htmlファイルの一覧表示と最終更新日付の表示をしたいと思っています。しかし、一部のファイルの最終更新日付が正しく表示されません。なぜでしょうか?
  • Windows 2000 Server、IIS、ActivePerlの環境でPerl/CGIを使用しています。特定フォルダ内の.htmlファイルを一覧表示し、最終更新日付も表示したいのですが、一部のファイルの最終更新日付が1970年1月1日になってしまいます。解決策を教えてください。
回答を見る
  • ベストアンサー

ファイルの日付取得

お世話になります。 Perl/CGIで悩んでいるところがあり質問させていただきに参りました。 サーバ上の、とあるフォルダに下にある.htmlファイルの一覧を表示・リンクし、またその各ファイルの最終更新日付を表示したいと思っています。 そこで下記の様な、ソースを書きました。 opendir (DIR,$dir) ; @files = grep { /\.html$/ } readdir DIR; close DIR; foreach $filename (@files){ $modtime = (stat($filename))[9] ; # ($sec, $min, $hour, $mday, $mon, $year) = localtime($modtime); $year = $year + 1900; $mon= $mon + 1; print "<a href=html/$filename>$filename</a>[作成日:$year 年$mon月$mday日$hour時$min分$sec秒]<P>\n"; } これを実行すると、複数ファイルのうち、1つのファイルだけが、なぜか正常に表示され、あとのファイルはすべて 「1970 年1月1日9時0分0秒」となってしまいます。 これはどうしてなんでしょうか?? 分かる方がいらっしゃいましたら、ご教授の程、よろしくお願いします。 環境:Windows 2000 Server,IIS,ActivePerl

  • Perl
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.1

カレントディレクトリの下の $filename の情報を取得しようとしているのでは? 正常なファイル名はカレントディレクトリにも存在しているから取得できてるのかも さて $modtime = (stat($filename))[9] ; ↓ $modtime = (stat("$dir\\$filename"))[9] ; ではどうでしょうか

chapter002
質問者

お礼

返答ありがとうございます。 まさにそのとおりでした! ありがとうございました。

関連するQ&A

  • 日付求め

    お世話になります。 早速ですが、perlで以下のように 現在時刻を求め表示するロジックがあります。 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); $year=$year + 1900; $mon =$mon + 1; $date81 = "$year年$mon月$mday日($days[$wday])"; $date82 = "$hour時$min分$sec秒"; この時、 例えば今年末であれば、 2009年1月1日0時と表示されると思います。 これを2008年12月31日24時と表示したいのですが、 何か妙案はあるでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • Perlで日付を取得する

    Perlで日付を取得する perlで1週間分の日付を取得し、セレクトボックスに格納したいと思っています。 なるべくいま使っているサブルーチンを使いたいです。 # 現在日時を文字列化する sub get_date_string { # local(@week) = ("日", "月", "火", "水", "木", "金", "土"); local(@week) = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); $year += 1900; $mon++; # 文字列化する if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } $weekstr = $week[$weekday]; return "$year-$mon-$day ($weekstr) $hour:$min"; # return "$year年$mon月$day日 ($weekstr) $hour時$min分$sec秒"; } これを別のルーチンで、 $today = substr(&get_date_string,0,10); $kinou = $today - 1; $ototoi = $today - 2; として、今日の日付だけでなく、昨日、おととい、その前の日を取得したいと試みましたが、今日は取得できても、$kinouや$ototoiは、すごい数字になってしまいます。 変わりに -24*3600と引いてみましたがダメでした。 文字列に変更されていないから引けないのでしょうか? かんたんに処理できそうでできないので、詳しいやり方を教えてください。

    • ベストアンサー
    • Perl
  • Perlでの Timeの足し算

    時間の足し算をやりたい。訳あってライブラリが使えません。 方法は無いでしょうか? 仮にライブラリが使えるなら、下記のようでうまく行っています。 --------------------------------------------------- use Time::Local; $year=2008; $mon =10; $mday=24; $hours = 23; $min = 0; $sec = 0; $time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); $a1=($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time ); $mytimeORG= sprintf("%04d/%02d/%02d %2d:%2d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytimeORG\n"; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time + 32400); #9H加算 $mytime9H= sprintf("%04d/%02d/%02d %02d:%02d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytime9H\n"; ---------------------------------------------

    • ベストアンサー
    • Perl
  • perl-cgiのリネームについて

    Perl-CGIで ABCという、ディレクトリの中のファイルの名前を、ランダムな名前に変換したいのですがうまくいきません。 これを動作させるたびになぜか、どんどんファイルが減っていってしまいます。 どなたか、教えていただけないでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl print "Content-Type: text/plain\n\n"; $| = 1; my ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); my ($nowtime) = sprintf("%02d_%02d_%02d_%02d_%02d_",$year+1900,$mon+1,$mday,$hour,$min,$sec); #ディレクトリのファイル個数を記録する $dir = "./ABC/"; # ← ディレクトリを変数にセットする opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; # ← 「.」 「..」 以外のファイルを取得 close DIR; srand; for (my $i = @files; --$i; ) { my $j = int rand ($i + 1); next if $i == $j; @files[$i, $j] = @files[$j, $i]; } $num = 0; use File::Copy; foreach(@files){ $getpath = "$dir"."$_"; if( copy($getpath, "$dir".$nowtime.$num++.'.dat') eq 1){ $num++; unlink($getpath);}else{print "Copy Error"; exit;} }

    • ベストアンサー
    • CGI
  • 掲示板への書き込み時間

    掲示板CGIについて質問です。 使おうとしているスクリプトはそのままアップロードすると書き込みした時間の表示が 「4/14 (Sun) 17:10」 のようになります。 これを 「2003 4/14 (日) 17:10:50」 のように年と秒まで加えたいのです。 それで後者のように表示される掲示板CGIを参考にしてみましたが、目立った違いはないように思え、どこをどう変更すれば年や秒まで表示されるようになるかわかりません。 思い当たる部分はこのあたりなのですが…。 ↓このように記述されています ************ $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year = sprintf("%02d",$year + 1900); $month = sprintf("%02d",$mon + 1); $mday = sprintf("%02d",$mday); if ( substr($month,0,1) == 0 ) { $month =~ s/0/ /; } if ( substr($mday,0,1) == 0 ) { $mday =~ s/0/ /; } $hour = sprintf("%02d",$hour); $min = sprintf("%02d",$min); $sec = sprintf("%02d",$sec); $youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; $date_now = "$month/$mday ($youbi) $hour:$min"; ************ CGIに手を加えてレイアウトの変更くらいはいつもやっています。 もし書き換える方法がありましたら教えていただければと思います。 どうぞよろしくお願い致します。

    • ベストアンサー
    • CGI
  • localtimeについて

    まだCGIを勉強はじめのなのですが、localtimeについて質問させてください。 書籍で時間取得には ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); とし、time関数で得たものをlocaltime関数で整形 といった事が書かれています。 まずわからないのが最初の ($sec,$min,$hour,$mday,$mon,$year,$wno) = の部分なのですが、カッコ内に変数を並べるというのはどういった命令なのでしょうか?書籍ではここまででこのような使い方や記述は出てきていないので、それ自体がよく理解できずにいます。それとも($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time);をおきまりパターンとしてワンセットで覚えるべき事なのでしょうか。 続いてlocaltime(time)ですが、これは()内のtime関数によって取得された1970年基準からの秒数を、localtimeによって英語圏での標準的な日付時間表記に直して表示するという事で良いのですよね? これが、なぜ ($sec,$min,$hour,$mday,$mon,$year,$wno) とすることで各変数に割り振ることができるのかがよく分かりません。 これらはおきまりパターンとして覚えるべき事なのでしょうか?それとも配列のようにあるパターンに乗っ取って書かれ得いる事で他に応用がきくような意味合いのものなのでしょうか? ご教授いただきたく思います。 よろしくお願いします。

    • 締切済み
    • CGI
  • ディレクトリ内のファイル一覧を出力するCGI

    以下のような、ディレクトリファイル一覧を出力する スクリプトなんですが、apacheのように ファイル名、時間、ファイルサイズ順に並べ替える機能を 実現させるにはどうすればよいでしょうか? 力不足ですみません、教えて頂けると幸いです。 #!/usr/local/bin/perl opendir(DIR,"."); @item = readdir(DIR); use Cwd qw(getcwd); use File::Basename qw(basename); my $curdirname = basename getcwd(); $out = "<table>\n"; $out .= "<tr><td align=\"center\">ファイル名</td><td align=\"center\">サイズ(byte)</td><td align=\"center\">更新時刻</td></tr>\n"; foreach(@item){ # .か..か*.cgiなら飛ばす (($_ eq '.') or ($_ eq '..') or /\.cgi$/ or /\.htaccess$/ or /\.pl$/ or /\.dat$/) and next; # ファイルの情報 ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($_); # 更新時刻変換 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($mtime); if(-d $_){ $size = "<b><font color=\"#FF0000\">ディレクトリ</font></b>"; $_ .= '/' } $year += 1900; #$month += 1; $mon += 1; $weekday += ('日','月','火','水','木','金','土'); ; #$out .= "<tr><td><a href=$_>$_</a></td><td>$size</td><td>$year/$month/$mday $hour:$min:$sec</td></tr>\n"; $out .= "<tr><td><a href=$_>$_</a></td><td align=\"right\">$size</td><td>$year\年$mon\月$mday\日 $hour:$min:$sec</td></tr>\n"; } $out .= "</table>\n"; print <<EOF; Content-type: text/html <html> <body> Index of \/$curdirname $out </body></html> EOF

    • 締切済み
    • CGI
  • 1桁の日付に0を付ける

    日時を取得して、表示する際に「2010/3/16」を、→「2010/03/16」 のように数字が1桁の時だけ「0」を足して表示させたいのですが どのようにすれば良いでしょうか。 ------------------------------------- ($sec,$min,$hour,$day,$mon,$yea,$wdy,$yday,$isdst) = localtime(time); $year = $yea + 1900; $mon++; $nitiji= join("","$year/$mon/$day"," ","$hour",":","$min"); ------------------------------------- 上記の方法で、perlで書き出したhtmlに「$nitiji」を埋め込んで表示させているのですが 「0」をつけることができず困っております。 (システム上、そのようにしたいので) できれば「print(・・・」「「printf(・・・」」などの形式ではなく 「$nitiji」に直接その数値を入れられると良いのですが。 良い方法がありましたら宜しくお願いします。

    • ベストアンサー
    • Perl
  • ファイル名を一括変更したいが正規表現方法を教ええください。

    リモート側のファイル名を一括変更したのですが、正規表現の方法がわかりません。 現在は以下のとおり記述しています。 opendir(DIR, $FTPdir); @FTPlist = grep (/^$head$year$mon$mday.*\.csv$/, readdir(DIR)); closedir(DIR); if (@FTPlist){ foreach (@FTPlist) { rename /^$head$year$mon$mday.*\.csv$/,/^$head$year$mon$xday.*\.csv$/,); print ; print "\n"; } }

    • ベストアンサー
    • Perl
  • フォルダ内のファイル名取得の仕方が分かりません

    Apache2.0.47、PHP4.3.2で使用しています。 フォルダ内のファイル名の取得を以下のように書いています。 (scandirは使えませんでした) <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { $files[] = $filename; } sort($files); print_r($files); ?> "."と".."も取得されるので、以下のように変更したのですが同じ結果でした。 <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { if(filename!=". "){ if(filename!=".. "){ $file[] = $filename; } } } sort($files); print_r($files); ?> "."と".."をはぶいたファイル名だけを取得したい場合にはどうすればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP