• 締切済み

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」の下の「フォルダ名の末尾に機能」ディレクトリに 潜ることを成功しているようなのですが、次回以降に失敗しています。 この症状について、理由等、お分かりの方、よろしくお願いいたします。

  • supob
  • お礼率81% (49/60)
  • Perl
  • 回答数1
  • ありがとう数2

みんなの回答

  • 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'では、末尾に'/'をつけるだけで、 \エスケープしていなくても、ディレクトリとして判定していますので)

関連するQ&A

  • Windows漢字フォルダ名の扱い(その2)

    先回に引き続きお伺いします。 ■フォルダツリー体系が次のようになっているとき、 D:\TEMP ├─フォルダ名の末尾に機能 │ test1.txt ├─フォルダ名の末尾に表 │ test2.txt ├─途中に機能がある │ test3.txt └─途中に表がある test4.txt ■次のスクリプトを処理させるのですが、 #!perl use strict; &subdir($ARGV[0]); sub subdir { my($dir) = $_[0]; opendir(DIR,"$dir") || die "'$dir' $! stopped"; foreach(sort readdir(DIR)){ next if(/^\.+/); # '.' '..' はパス if(-f "$dir\\$_"){ print "'$dir\\$_'\tはファイルです\n"; }elsif(-d "$dir\\$_"){ print "'$dir\\$_'\tはフォルダです\n"; &subdir("$dir\\$_"); }else{ print "'$dir\\$_'\tは何ですか?\n";#出て欲しくない } } closedir(DIR); } ■結果は、次のようになります。 (※フォルダ名の末尾に特殊な漢字コードがある所が判定できない) C:\>test.pl d:\temp 'd:\temp\フォルダ名の末尾に機能' は何ですか? 'd:\temp\フォルダ名の末尾に表' は何ですか? 'd:\temp\途中に機能がある' はフォルダです 'd:\temp\途中に機能がある\test3.txt' はファイルです 'd:\temp\途中に表がある' はフォルダです 'd:\temp\途中に表がある\test4.txt' はファイルです 先回、色々と教わったこと use encoding "Shift_JIS"; や 局所的に $dir を decodeさせるなどしても上手く行きません。良い方法があれば教えてください。

    • ベストアンサー
    • Perl
  • ExcelVBAでサブフォルダ名などを取得したい

     ExcelVBAで、Dドライブ内の特定のフォルダ(D:\My Documents等)の中にある全てのフォルダ名やファイル名を取得したいのですが、方法が分かりません。  Dドライブのすぐ下にあるフォルダはDirで取得できるようなのですが、サブフォルダ名が取得できないのです。  具体的にどのように書いたらよいかお教えいただけるとうれしいです。  よろしくお願いします。

  • Net::FTPを使いフォルダ一覧を取得したいと思い以下の参考サイトを

    Net::FTPを使いフォルダ一覧を取得したいと思い以下の参考サイトを発見しました。 http://dqn.sakusakutto.jp/2008/06/perl_netftpftp.html 非常に分かりやすく早速スクリプトを使用して作成しましたがこのスクリプトですと「/」ルート直下の一覧で取得されてしまいます。 (ここから) use Net::FTP; my $ftp = Net::FTP->new("hoge.sav.ne.jpp", Debug => 0 , Passive => "true"); # 接続 $ftp->login("xxxx", "pass"); # ログイン my @dir = $ftp->cwd('/public_html'); my @dir = grep /^d/, $ftp->dir; # ← フォルダ一覧をdirコマンドで取得 my @dir_names_full = @dir[2..$#dir]; #  自フォルダと親フォルダ("."と"..")を除く。 my @dir_names_short = map { (split)[8] } @dir_names_full; # フォルダ名のみを取得 $ftp->quit; (ここまで) $ftp->cwd('/public_html');を追加したのですが、 drwxrwx--- 2 xxxx xxxxx 48 Sep 3 14:59 Maildir drwx---r-x 2 xxxx xxxxx48 Sep 3 14:59 log drwx---r-x 1019 xxxx xxxxx 40584 Dec 28 00:25 public_html となってしまいます。 $ftp->dir;  を $ftp->dir('/public_html'); としてもみましたがうまくいきませんでした。 すみません。ご指導を賜りたく書き込みました。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 月末日のフォルダを自動作成したい

    batファイルで以下のような処理をしたいのですが上手くいきません。 どなたかご存知でしたらご教授いただきたく・・・ --------------------------------------------------------------------- (1)フラグファイル名によってフォルダを自動生成する  例)   (1)*_25.txtというファイルがあったら、当月25日のフォルダを作成する    →c:\temp\20110425 (2) *_31.txtと言うファイルがあったら、前月末日のフォルダを作成する    →c:\temp\20110331 (2)上記(1)で作成したフォルダの下にファイルの接頭子によってサブディレクトリを作成する  例)   01_*.txtというファイルがあったら   →c:\temp\20110331\01 と作成したい ※上記をsetコマンドを用いて作成してみたのですが、  (1)-(2)の場合にどうしても上手く動きません。  以下、作成してみた駄文:  set zyy=%date:~0,4%  set zmm=%date:~5,2%  rem set zmm=01  set zdd=%date:~8,2%  rem Dフォルダにあるフラグファイルでフォルダを作成  if exist d:\temp\test01\*_05.txt set zfld=%zyy%%zmm%05  if exist d:\temp\test01\*_10.txt set zfld=%zyy%%zmm%10  if exist d:\temp\test01\*_15.txt set zfld=%zyy%%zmm%15  if exist d:\temp\test01\*_20.txt set zfld=%zyy%%zmm%20  if exist d:\temp\test01\*_25.txt set zfld=%zyy%%zmm%25  if exist d:\temp\test01\*_31.txt set/a zmm2=%zmm%-1  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 0 set zyy2=%zyy% )  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 0 set/a zyy2=%zyy2%-1 )  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 0 set zfld=%zyy2%1231 )  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 1 set zfld=%zyy%0131 )  上記のような感じで、12ヶ月分記述(閏年対応はしない)  その後、以下の構文を発行するとエラーとなってしまいます。  remファイル接頭子によって、サブディレクトリ作成  if exist d:\temp\test01\01*.txt md d:\temp\test01\%zfld%\01 ※ここで『サブディレクトリまたはファイル\01は既に存在します』とエラーになります。   (恐らく、set/aを使っているがため?)   大変お手数ですが、誰かお助け下さい。 以上よろしくお願い致します

  • 一定時間が経過したフォルダの削除

    一定時間が経過したファイル削除のsauceを使って、サーバーのディレクトリを削除しようとしましたが指定した時間内のディレクトリが削除できません。間違っている個所をご指摘くださいますようお願い致します。 #古いディレクトリの削除 $dir='./z'; opendir(DIR, "$dir"); my @dirlist = grep /^*/, readdir DIR; closedir(DIR); my $expire_t = 15552000; #180日以上経過したファイル指定  (1日は86400) my $expire_d = 31536000; #365日以内に生成されたファイル指定 my $now = time; foreach my $deldir (@dirlist){ my $mtime = (stat("$dir/$deldir"))[9]; if ($now > $mtime + $expire_t && $now < $mtime + $expire_d){ rmdir("$dir/$deldir"); } } どうぞ宜しくお願いします。

    • ベストアンサー
    • Perl
  • フォルダ内のファイル名を取得して配列にぶち込みたいです

    こんにちは。 フォルダ内ファイル名を一覧にして表示させることまでは出来ますが、 この一覧表示されたファイル名を配列に入れるにはどうしたらよいでしょうか。 <?php $dir = "sample/"; // ディレクトリの内容を読み込みます。 if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: " . $file . "<br />\n"; } closedir($dh); } ?> ご教示宜しくお願い致します。

    • ベストアンサー
    • PHP
  • フォルダー名末尾空白のフォルダーの削除方法を教えてください

    パソコンのMy documentsの中に末尾が空白(半角スペース)のフォルダー名を作ってしまい削除できずに困っています。末尾が空白のフォルダー名の削除について方法あれば教えて下さい。 末尾が空白のフォルダーは具体的には次の2つのフォルダーです。  \My Documents\photo\hanato       〃         \花と風景2 上記フォルダーは削除及び名前の変更・コピー・移動等も出来ません。 (1)削除しようとすると   ファイルの削除できません。送り側のファイルまたはディスク から読み取れません。 (2) フォルダー名変更しようとすると   ファイルの名前を変更できません。送り側のファイルまたは ディスクから読み取れません。 のようなメッセージが出ます。

  • フォルダ内のファイル名の末尾7文字を一括置換

    フォルダ内のファイル名の末尾7文字を一括置換 こんにちは、VBA初心者です。 D:\test フォルダに test_jp.txt、sample_jp.txt、testsample_jp.txt といった名前のファイルが格納されているとします。 これらのファイル名の「_jp.txt」の部分(末尾7文字の部分)を「_en.txt」に置換したいのですが、うまくいきません。 以下のようなプログラムを書いてみたのですが、どこがいけないのでしょうか。 ※「実行時エラー53 ファイル名が見つかりません。」となります。 ※ VBEのローカルペインによると、エラー時には filename 変数に sample_jp.txt が格納されています。 Sub ファイル名置換() Dim fileName As String fileName = Dir("D:\test\*_ja.txt") Do Until fileName = "" Name "D:\test" & fileName As "D:\test" & Left(fileName, Len(filename) - 7) & "_de.txt" filename = Dir() Loop End Sub

  • ディレクトリ名を取得したい

    perlでディレクトリ名だけを取得したいのですが、 なかなかうまい方法が見つかりません。 ファイル名を取得する・・・というのは結構あるのですが、 ディレクトリ名だけ、というのがどうもわかりません。 ちなみにファイル名取得は以下のようにやっています。 my $md; opendir(DIR, 'q'); while (defined($dir = readdir(DIR))) { $md=substr($dir,0,6); } closedir(DIR); ディレクトリ名だけを取得・・・というのはどうやればよいのでしょうか。

    • ベストアンサー
    • Perl
  • UNIXの"find"コマンド同等のプログラム作成について

    お世話になっております。 現在UNIXの"-type f"オプションのついた"find"コマンドと同等のプログラムをC言語で作ろうとしています。 つまりディレクトリ内のファイル(サブディレクトリ内のファイル含む、ディレクトリは除外)を全てフルパスで表示するプログラムです。 現在下記の関数を作成したのですがうまく動いてくれません。 どなたかご教授いただけないでしょうか。 【問題】 プログラム内の(**)前後で"dir1"が変更される。 (**)前:"/ディレクトリA/" (**)後:"/ディレクトリA/ディレクトリA内のファイル1" 本当は"dir1"には:"/ディレクトリA/"のままであってほしいです。 "strcat"コマンドの仕様が影響しているのでしょうか。 int _find(char dir1[] , int k ,int l , int m ) { DIR *dir ; struct dirent *dp ; struct stat statbuf ; char txt[1000] ; if ( m == 0 ) l++ ; if ( (dir = opendir(dir1)) == NULL ){ printf("%s",dir1) ; perror("opendir") ; exit(1) ; } for( dp=readdir(dir) ; dp != NULL ; dp=readdir(dir) ){ if ( strcmp(dp->d_name,".") != 0 && strcmp(dp->d_name,"..") != 0 ){ /* ROOT_DIR名-にファイル名を付け加えて、フルパスにする */ strcpy( temp[k][l] , dir1) ; strcat( temp[k][l] , "/" ) ; strcat( temp[k][l] , dp->d_name ) ;  (**) stat( temp[k][l] , &statbuf ) ; if(S_ISDIR(statbuf.st_mode)){ l=_find(temp[k][l],k,l,1) ; }else{ sort[k][l]=temp[k][l] ; printf("temp[%d][%d]=%s\n",k,l,sort[k][l]); printf( "dir5=%s\n",dir1) ; l++ ; } } } closedir(dir) ; return l ; }

専門家に質問してみよう