• 締切済み

CGIにおけるサーバへのファイル書込みについて

[Mon Oct 16 16:27:12 2006] [error] [client 207.46.98.48] Premature end of script headers: prev.cgi [Mon Oct 16 16:27:13 2006] [error] [client 66.249.72.6] damy.dat Cannot Open at /home/e-fresh/public_html/prev.cgi line 71. サーバに上記のようなエラーログがありまして, ファイル作成&書込みができません。 私自身としては,サーバのフォルダに書込み権限が無い事が考えられます が,それをチェックする方法があれば併せてご教示願います。 prev.cgiの中身は下記の通りです。 $damy = 'damy.dat'; open DB,"$d_file" or die "$d_file オープン失敗"; open DAMY,">$damy" or die "$damy Cannot Open"; while (<DB>){            …} close DAMY; close DB; #ダミーファイルをデータファイルにリネーム rename($damy, $d_file) or die "Could not RENAME $damy TO $d_file";

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

みんなの回答

回答No.2

>私自身としては,サーバのフォルダに書込み権限が無い事が考えられます >が,それをチェックする方法があれば併せてご教示願います。 openする前にチェックするのであればフアイルテスト演算子です。 http://www.rfs.jp/sb/perl/02/08.html#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%86%E3%82%B9%E3%83%88%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%AE%E4%B8%80%E8%A6%A7 サンプル $test_file = './test.dat'; unless(-w $test_file){print "$test_file は書き込めません";} else{print "$test_file は書き込み出来ます ";}

sankan2006
質問者

お礼

ご回答ありがとうございました。 大変参考になりました。

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.1

$!(ドルビックリ)にその答えが入っています。 open DAMY,">$damy" or die "$damy Cannot Open"; ↓ open DAMY,">$damy" or die "$damy Cannot Open: $!";

sankan2006
質問者

お礼

ご回答ありがとうございました。 大変参考になりました。

関連するQ&A

  • perlで以下の動作が出来る機能を作っています。

    perlで以下の動作が出来る機能を作っています。 1.ファイル名が載っているfname.txtを読み込む。 2.読み込んだファイル名を開く。 3.ファイルの内容を変換。 4.変換したファイル内容をnew_fileディレクトリに保存。※ファイル名はそのまま。 1~4までを作ったのですが、fname.txtで指定した全てのファイル名を変換して保存したいのに、一番最初に記載されてあるファイル名しか置換されません。書籍などで調べてもわからないのと今日中に製作したいのでここで質問しました。 ご教授お願いします。 以下にソースを貼ります。 #!/usr/local/bin/perl -w use strict; my $x = 0; my $y = 0; my $z = 0; open(IN,"<"."fname.txt")or die "cannot open txt_file: $!";#fname.txtを開く while(<IN>){ #chomp $_;#改行してファイル名を書き込んでいるので、改行を消去 my $fn = $_; my @F = $fn; foreach my $FNAME (@F){ open(FILE,"$FNAME")or die "cannot open txt_file: $!";#fname.txtに記載してあるファイルを開く open(OUT,">". "new_file/$FNAME")or die "cannot write txt_file: $!";#new_fileを開いて書き込む while(<FILE>){#以下、ファイルの置換内容 my @d; if (m/^[X1-9]+ (.*)/s) { ($y,$z)=(0,0); $d[0] = ++$x; $d[1] = 0; $d[2] = 0; $_ = $d[0] . " " . $1; } if (m/^[X1-9]+\.[X1-9]+ (.*)/s) { $z=0; $d[0] = $x; $d[1] = ++$y; $d[2] = 0; $_ = $d[0] . "." . $d[1] . " " . $1; } if (m/^[X1-9]+\.[X1-9]+\.[X1-9]+ (.*)/s){ $d[0] = $x; $d[1] = $y; $d[2] = ++$z; $_ = $d[0] . "." . $d[1] . "." . $d[2] . " " . $1; } print OUT $_; } } close(IN); close(FILE); close(OUT); exit ; }

  • Perlでのファイル入出力、処理方法

    メモ帳で以下のようなプログラムを書きました。(file_1.plで保存しました) #!/usr/bin/perl $file="data.csv"; $cityfile="name.txt"; $outfile="data_out.csv"; open (IN, $file) or die "$!"; open (FILE, $file) or die "$!"; open (OUT, ">$outfile") or die "$!"; @city = <FILE>; ・ ・ ・ これをCygwinコマンド上で、 perl file_1.pl と入力し、Enterを押すと「No such file or directory at file_1.pl line 9.」と表示されます。 line9はopen (FILE, $file) or die "$!";という文です。 どこが間違えで、どのように修正すればよいのでしょうか。 よろしくお願いします。

  • ディスク残量が無くなってしまった場合のファイル操作

    都合上、検証ができません。 最悪、『サーバーのディスク残量が無い時』に 以下3パターンの処理実行時の挙動(ちゃんとエラーが帰ってきてdieに行くのか?など)はどうなるかご存知でしたら宜しくお願い致します。  # File::Copyモジュールによるコピー時 copy ("foo.txt", "bar.txt") or die "Copy failed: $!";  # File::Copyモジュールによるムーブ時 move ("foo.txt", "bar.txt") or die "Move failed: $!";  # 書き込み時 open(OUT,"> file.txt")or die "Can't open file.txt: $!"; print OUT "DEF"; close(OUT); renameは問題ないと思っています。。

  • 1ファイルずつ読み込みたい

    ウィンドウズ環境でactive perlを利用しています。 あるディレクトリーの中に2000位のファイルが入っており、このファイルを読み込んで置換処理を行うため下記のようなperlを作っています。 1ファイルはおおよそ3000行くらいです。 foreach(<*.html>) { open(IN_FILE, $_) || die; open(OUT, ">$_.tmp") || die; @record=<IN_FILE>; foreach $record (@record){ $record =~s/aaa/bbb/isg; } print OUT @record; close( IN_FILE); close( OUT); rename("$_.tmp", $_) ; } 当たり前かもわかりませんが、メモリー不足になり処理が中断します。 ディレクトリーの中のファイル数を600程度に少なくすると処理が完了します。 そこで質問なのですが、ディレクトリーの中のファィルを一度に全部読み込まず、1ファイルずつ順次読み込んでいくことはできないでしょうか。 最初の1行目のforeachをwhileに変えたりしたのですがうまくいきません。 対応策あればご教示ください。

    • ベストアンサー
    • Perl
  • PHP、外部ファイルにテキストを書きだす。

    こんにちは、皆様。 下記のソースを実行したいと思います。期待する結果としては、外部ファイルに行列に書き出すことです。 <?php $count_file="count.dat"; if(file_exists($count_file)){ $file = fopen("count.dat", "a") or die("file can not open"); $order_no = fgets($file) + time(); print $order_no; }else{ $file = fopen($count_file, "w") or die("file can not open"); $order_no = time(); } set_file_buffer($file,0); flock($file, LOCK_EX); fputs($file , $order_no); flock($file, LOCK_UN); fclose($file); ?> このソースの結果は配列として書き込まれてました。こんな感じです。 129835261512983526501298355377129835537912983566121298356635 このソースを実行する度にcount.datファイルに順次書き出したと思います。 1298352615 1298352650 1298355377 1298355379 1298356612 1298356635 まだまだPHP勉強中なのでわかる方教えてください。 (1)この行で$order_no = fgets($file) + time(); 改行記号をどう付ければ良いでしょうか? (2) C言語のようにポインターで指定しなければならないですか?書き方を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • カウンタのcgiについて教えてください。

    カウンタのcgiについて教えてください。 open(File,"+<count.dat")or die("エラー"); eval{flock(File,2);}; $count=<File>; seek(File,0,0); print File++$count; close(File); print<<END; Content-type:text/html <html> <head> <title>タイトル</title></head> <body>$count人目の訪問者です </body> </html> みたいな感じでカウンタのcgiを作りました。 (Perl・Apache) (携帯からなので、見にくい感じはご容赦ください) これを別htmlファイルにiframeで組み込みました。 今は、単純にファイルが開かれたら+1なので、F5などで更新してもカウントされます。 これを同一IPもしくはコンピュータ名からの連続更新はカウントしないようにするのはどのように書き加えればいいのでしょうか? また、総カウント数だけでなく、昨日のカウント数、今日のカウント数、今月、先月などで集計するためにはどのようにすればよいのでしょうか? わかりにくいかと思いますが、お願いいたします。 m(__)m

    • ベストアンサー
    • CGI
  • 一つのテキストファイルと複数のファイルの結合

    よろしくお願いします.ディレクトリ内の一つのテキストファイル(joint.txt)と複数のファイルの結合を行ごとに隣へ結合するプログラムを作成しています.ここで以下のプログラムを作成したのですが,うまくいかないため,誤っている部分をご指摘願えないでしょうか. my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); open(FILE, $dir) or die "$dir: $!"; open(FILE2,"joint.txt"); my @file = <FILE>; my @file2 = <FILE2>; close(FILE); close(FILE2); foreach my $line (@file) { foreach my $line2 (@file2) { chomp $line2; $line = "$line2.",".$line"; } } open(NEWFILE, "> $dir") or die "$dir: $!"; print NEWFILE @file; print NEWFILE @file2; close(NEWFILE); } closedir(DIR);

    • ベストアンサー
    • Perl
  • クリックカウンタで隠しページにジャンプさせたい

    クリックカウンタについて教えて下さい。 (1)ある特定のカウント(例えば10)になったら隠しページに飛ばしたい (2)その後は何度クリックしてもカウント数はかわらない(動作させない) (3)その後カウントをクリアして再度クリックカウント出来るようにしたい (1)はなんとか出来ました。ですが、その後の動作が上手く出来ません。どなた様かアドバイスをお願い申し上げます。 <<click.cgi>> #!C:\Perl\bin\perl #=================================================== # 各種設定 #=================================================== $lockfile = "./lock"; $jumpurl = "./blog.html"; #ジャンプさせたい隠しページのURL $hikaku = 9; #日時の取得------------------------------ @youbi = ('日', '月', '火', '水', '木', '金', '土'); ($sec,$min,$hour,$mday,$mon,$year,$week,$yday,$sammer) = localtime; $year += 1900; $mon += 1; $yday = ""; $sammer = ""; $now = "$year年$mon月$mday日($youbi[$week]) $hour:$min-$sec秒\n"; #=================================================== # カウントアップ #=================================================== $url = $ENV{'QUERY_STRING'}; &lock; #ログファイルからデータの読み込み---------- open (IN,"<cntdata.dat") || die "Open Error!\n"; $cnt = <IN>; close IN; if($cnt >= $hikaku){ open (FILE, ">text.dat") || die "Open Error!\n"; print FILE "$now<br />10クリックを超えました。ご利用ありがとうございました。"; close FILE; open (OUT,">cntdata.dat") || die "Open Error!\n"; $cnt = 1; print OUT $cnt; close OUT; print "Location: $jumpurl\n\n"; exit; } #記録の更新-------------------------------- $cnt++; #カウントアップ $count = sprintf("%04d", $cnt); open (OUT,">cntdata.dat") || die "Open Error!\n"; print OUT $count; close OUT; &unlock; print "Location: $url\n\n"; #元のページにジャンプさせる exit; #=================================================== # エラーと排他処理サブルーチン #=================================================== sub lock { $retry = 3; if (-e $lockfile) { $locktime = (stat($lockfile))[9]; if ($locktime < time - 60) {&unlock;} } while (!mkdir($lockfile, 0755)) { if (--$retry < 0) {&error;} sleep(1); } } sub unlock {rmdir($lockfile);} <<cntdata.dat>> クリック数 <<text.dat>> 日時とありがとうメッセージ <<index.shtml>> <html> <head> <title>サンプル</title> </head> <body> <a href="./click.cgi?./index.shtml">クリック</a> <p>現在のクリック数:<!--#include file="./cntdata.dat"--></p> <p><!--#include file="./text.dat"--></p> </body> </html> 10クリック超えて、カウンタの数字が1に戻るのですが、その後またクリックすると動きません。なので、(3)にしたい場合には何をすればよいのでしょか。また(3)が無理なら(2)のようにクリックしてもcgiを動作しないようにしたいです。

    • ベストアンサー
    • Perl
  • ファイルをアップロードするCGI

    ファイルをアップロードしたいCGIが欲しく サンプルをみつけたのですが、このCGIだと ファイルをアップロードしたときに、ファイル名がアップロードした時刻になってしまいます。 ファイル名を変更することなく、アップロードするにはどう変更すればよいのでしょうか? お願いします。ちなみにアップロードしたいファイルの種類はエクセル形式のファイルです。 プログラムは以下のようになってます。 #!/usr/bin/env perl use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use POSIX qw(strftime); my $q = new CGI; print $q->header(), $q->start_html(); #print $q->dump; # for debug my $outputdir = "log"; # ファイルを置く先 (ディレクトリ) my $fh = $q->param('uploaded_file'); my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子 if ($fh ne "") { my $timestamp = strftime "%y%m%d%H%M%S", localtime; my $outputfn = "$outputdir/$timestamp$ex"; open(F, "> $outputfn") or die; flock(F, 2); if (defined $fh) { while (<$fh>) { print F $_; } } close F; print qq{saved as <a href="$outputfn">$outputfn</a>}; } print $q->start_multipart_form(-name => 'myform'), $q->filefield(-name => 'uploaded_file'), $q->submit("OK"), $q->endform, $q->end_html(), "\n";

  • cgiでのファイルオープン

    cgiでファイルをオープンする時 open IN,"$file" でオープンしているのですが この時、$file に他のサーバー下のファイルを指定すると エラーになってしまうんですか? 管理しているサーバーが2つあり、他方のサーバーからファイルを 読み込んで処理をしたいのですが、どうしたらいいのでしょうか? 読み込むだけで、書き込むことはしません。 お知恵を貸してください。 よろしくお願いします。

    • 締切済み
    • CGI

専門家に質問してみよう