トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

BBS-雑談掲示板/201

ページの作成や編集にはユーザ登録が必要です。

 カレントディレクトリを変更 - 名無しさん (2006年06月16日 15時01分26秒)

MS-IIS などではデフォルトでカレントディレクトリ(パス)が仮想ディレクトリのルートに固定されていて相対パスが正常に使用できない問題があります。

chdir でカレントディレクトリを変更しようとしても use などがコンパイル前に呼ばれてしまう(chdir より前に実行されてしまう)ため、そのままではエラーで動きません。そこで考えたのですが以下のような方法をとるとうまく動くようになります。

# 別の CGI でローカル上でワザと別のディレクトリから実行して

# みた限りでは動作しました。

# (この方法を使用しないと use でエラーになっていたので正常に

# 動作していると思います)

#!/usr/bin/perl

# カレントディレクトリを変更
$0 =~ s/\\/\//g;
$0 =~ s/((.*\/)*)[^\/]+$/$1/;
if($0) {
	chdir($0);
}

require "./wiki.cgi";
1;

上のようなスクリプトを作成して上記を実行することで次のような動作になります。(ただし、 wiki.cgi の最下行に 1; を追加しないとエラーになる)

  1. chdir でカレントディレクトリを変更
    1. カレントディレクトリが CGI のパスと同じなら変更しない
  2. require "./wiki.cgi"; で wiki.cgi を読み込む
  3. その後に use が実行される

上記の例では直接 $0 を正規表現で置き換えていますがちょっと問題が起こるかもしれません。結構使えると思うので試してみてはどうでしょうか。

  • BEGINブロック内でchdirすれば良いだけと思いますが... - Kinsan (2006年06月16日 22時37分15秒)
    • これをやる前にいろいろ試したのですが確か BEGIN ブロック 内でも use の方が先に動作していました。 - 名無しさん (2006年06月18日 06時47分53秒)
  • useに関してはBEGINブロックでuse libしたらどうなんでしょう - typer (2006年06月18日 22時32分31秒)
  • 試してませんがコマンドラインオプションの-xを1行目のperlの後に指定すると目的にかなうかもしれません。あとuseについては-xと同時には使えませんがコマンドラインオプションの-Iを使うという方法もあります。 - 時宮礼 (2006年07月02日 18時14分20秒)
お名前: コメント:

最終更新時間:2006年07月02日 18時15分36秒