外部ファイルの入出力
 
データをファイルに書き込むには、ファイルの入出力タイプを指定する必要があります。 ファイルの入出力のタイプには、ファイルへの書き込み(上書き)、追加書き込み、読み込み等がありますがそれぞれについて失敗の対処も考慮します。
ファイルのパーミッションにも注意する必要があります。

入力画面

新規作成後の画面

編集画面

[サンプルプログラムの実行]
 

<TEXTAREA>タグでテキストを表示する際には、テキスト中にHTMLタグが含まれている場合があるので'<'を'&lt;'に変換しておきます。'&lt;'で表示した'<'はCGIに戻ってくるときには'<'になっていますので、入力の際の変換処理は不要です。
また、SJIS では '書き込み可能' の '能' の下位バイトがバックスラッシュ(\)のコードと一致しているので'能'の後には空白文字を入れておきます。詳しくは「日本語コードの取り扱い」の項を参照してください。
 
fileio.cgi
#!/usr/bin/perl
#
# fileio.cgi
#
# (C)1999 Kaoru Fujita
#
use lib './lib';
require 'util.pl';

#
# 定数
#
$Title = '外部ファイルの入出力サンプル';
$Location = './tmp';
$CGIPath = '/cgi-bin';
use File::Basename;
$Program = basename($0);
$Encoding = 'sjis';
$CharSet = 'Shift_JIS';

parseInput($Encoding);

# テスト用
#$in{'Action'} = 'Create';
#$in{'File'} = 'abc';
#$in{'Data'} = '0123456789';

$act = $in{'Action'}; # Create/Add/Remove/Modify
$file = $Location.'/'.$in{'File'};
$data = $in{'Data'};

print qq(Content-type: text/html\n\n);
print qq(<HTML>\n);
print qq(<HEAD>\n);
print qq(<META HTTP-EQUIV="Content-Type" CONTENT="text/html\; charset=$CharSet">
\n);
print qq(<TITLE>$Title</TITLE></HEAD>\n);
print qq(<BODY>);

if ($act eq 'Create') {
        if (!-e $Location) {
                mkdir($Location, 0755) or
                        exitError("ディレクトリ $Location が作成できません。");
                print qq(ディレクトリ $Location を作成しました。<BR>\n);
        }
        exitError("すでにファイル $file が存在します。")
                if (-e $file);
        open(FH, ">$file") or
                exitError("ファイル $file がオープンできませんでした。");
        print FH $data,"\n" if ($data);
        print qq(ファイル $file を作成しました。 <BR>\n);
        close(FH);
}
elsif ($act eq 'Add') {
        open(FH, ">>$file") or
                exitError("ファイル $file がオープンできませんでした。");
        print FH $data,"\n" ;
        print qq(ファイル $file に追加書き込みしました。<BR>\n);
        close(FH);
}
elsif ($act eq 'Open'){

        my($mode);
        if (-e $file) {
                if (-w $file) {
                        $mode = '書き込み可能 ';
                }
                else {
                        $mode = '読み込み専用';
                }
        }

        open(FH, "$file") or
                exitError("ファイル $file がオープンできませんでした。");

        print qq(<P ALIGN="right">[<I>$file</I>]</P>\n);
        print qq(ファイルの内容 ($mode)<BR>\n);
        print qq(<FORM ACTION="$CGIPath/$Program", NAME="Form" METHOD="post">\n);
        print qq(<TEXTAREA NAME="Data" COLS="80" ROWS="24">);
        while (<FH>) {
                s/</&lt;/g;             # テキスト中のHTMLタグをエスケープする
                print;
        }
        print qq(</TEXTAREA>\n);
        print qq(<INPUT TYPE="hidden" NAME="Action" VALUE="Modify">\n);
        print qq(<INPUT TYPE="hidden" NAME="File" VALUE="$in{'File'}">\n);
        print qq(<INPUT TYPE="submit" NAME="Submit" VALUE="保存">\n);
        print qq(</FORM>\n);
        close(FH);
}
elsif ($act eq 'Modify'){
        exitError("ファイル $file に書き込むことができません。")
                unless (-w $file);

        open(FH, ">$file") or
                exitError("ファイル $file がオープンできませんでした。");

        # \r\n を \n に変換する。
        $data =~ s/\r\n/\n/g;
        print FH $data;
        print qq(ファイル $file を書き換えました。<BR>\n);
        close(FH);
}
elsif ($act eq 'Remove'){
        if (-e $file) {
                unlink($file) or
                        exitError("ファイル $file が削除できませんでした。");
                print qq(ファイル $file を削除しました。<BR>\n);
        }
        else {
                print "ファイル $file は削除済みです。\n";
        }
}

print qq(</BODY></HTML>\n);

exit(0);

#--End of fileio.cgi

 
fileio.html
<HTML>
<HEAD>
<TITLE>外部ファイルの入出力サンプル</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
function doIt(act)
{
        document.Form.Action.value = act;
        document.Form.submit();
}
//-->
</SCRIPT>
</HEAD>

<BODY>
<FORM ACTION="/cgi-bin/fileio.cgi" NAME="Form">
<INPUT TYPE="hidden" NAME="Action">
ファイル名: <INPUT TYPE="textfield" NAME="File" SIZE="24"><BR>
<INPUT TYPE="button" NAME="Create" VALUE="新規作成" onClick=doIt('Create')>
<INPUT TYPE="button" NAME="Open" VALUE="編集" onClick=doIt('Open')>
<INPUT TYPE="button" NAME="Remove" VALUE="削除" onClick=doIt('Remove')>
</FORM>
</BODY>
</HTML>