• 締切済み

Windows漢字フォルダ名の扱い(chdir編)

先回、次の質問をさせて頂いた者です。http://oshiete1.goo.ne.jp/qa2230450.html 今回、同様な環境にて、chdir()実行しようとすると、 D:\temp ├─フォルダ名の末尾に機能 ├─フォルダ名の末尾に表 ├─途中に機能がある └─途中に表がある スクリプト内では、次のように書いています(サブルーチン部) sub dir_recurs { my $sdir = @_; my ($d,$rc); my $cwd = Cwd::getcwd(); opendir(DIR,$sdir) || die "$cwd/$sdir") . " $! stopped"; my @dirs=(); my @files=(); foreach(sort readdir(DIR)){ if( -d "$_/" ){ next if(/^\.+/); # '.' '..' はパス push(@dirs,"$_"); }elsif( -f "$_" ){ push(@files,$_); # ディレクトリ以外有り }else{ print "ERROR: '$_' in $cwd.\n"; } } closedir(DIR); #----- 下位ディレクトリへ潜る if(@dirs > 0){ foreach $d (@dirs){ if(!chdir("$d/")){ print "ERROR: chdir($d) from $cwd\n"; next; } $rc = &dir_recurs("."); chdir(".."); } } : 前後関係は、はしょりますが、この処理部が走っているときに、 ERROR: 'temp.txt' in D:\temp\フォルダ名の末尾に機・ ERROR: chdir(フォルダ名の末尾に表) from 'D:\temp' ERROR: chdir(途中に機能がある) from 'D:\temp' ERROR: chdir(途中に表がある) from 'D:\temp' のような結果になってしまいます。 一番先頭でのエラーメッセージを見る限りは、 一度は、「D:\temp」の下の「フォルダ名の末尾に機能」ディレクトリに 潜ることを成功しているようなのですが、次回以降に失敗しています。 この症状について、理由等、お分かりの方、よろしくお願いいたします。

みんなの回答

  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.1

shift-jisの、"表、予、申、能、十、ソ"には0x5c(\)が入っているのでうまく動きません foreach $d (@dirs){ $d =~ s/\\/\\\\/g; if(!chdir("$d/")){ で、どうでしょう?

supob
質問者

お礼

ありがとうございました。 結局は解決できませんでしたが、 ActivePerl側(chdir)の対応を待ちたいと思います。

supob
質問者

補足

ご回答ありがとうございました。 試してみましたが、次のようになります。 ERROR: chdir(フォルダ名の末尾に表\) from 'D:\temp' ERROR: chdir(途中に機能\がある) from 'D:\temp' ERROR: chdir(途中に表\がある) from 'D:\temp' 以上のように、いい感じで、エスケープされているのですが、 どうも chdir() 関数が、それを嫌っているようです。 (そもそも、ファイル演算子'-d'では、末尾に'/'をつけるだけで、 \エスケープしていなくても、ディレクトリとして判定していますので)