作者: Bruce.
日時: 2008/1/16(00:12)
Bruce.です。

見たところファイル一覧の表示とファイルの取得をTk(とTcl)に任せているよう
なので
大丈夫だと思いますが、現状のPerlは小さな親切大きなお世話でパス名として
与えられた文字列に対して '\' → '/' の置換を内部で勝手にやってくれやがっ
てます。
例によってこれにより、2バイト目に0x5c('\')がくる文字を含んだShiftJIS文字
列を渡すと
見事に誤動作します。

大部分は2バイト目の'\'を'\\'に置換してから関数を使うことで回避できますが、

パス名の最後にダメ文字が来るようなパターン(c:/ドキュメント/一覧表)で
そのディレクトリに対するreaddirなどでどうしても回避できない状況が発生し
ます。

昔のことなんで正確なところは忘れました :)

Win32::ほげほげ なモジュールをごにょごにょすれば完全な回避が可能かも
しれませんが調べてません。

でわ。

林 宏 さんは書きました:

> sub OpenFile {          #ファイルを表示する
>   $mw->bell;
>   my $file  = $mw->getOpenFile(
>                 -title      => "Open File",
>                 -filetypes  => $types,
>                 -initialdir => $ENV{HOME}
>               );
>   if ( defined $file ) {
>     $drc    = $file;
>     $drc    =~ s/[^\/]+$//;
>     $drc = Encode::encode('Shift-JIS',$drc);
>     $l1 = "を選択しました。[cr]\n";
>     $l1  = Encode::encode('Shift-JIS',$l1);
>     print "OpenDrc[" , $drc , $l1;# <stdin>;
>     return $drc;
>   }
> }
> 
> sub Add_Date {# ファイル名先頭に日付(20071010_XXXXXXXXX)の「20071010_」を付ける
>   ($drc) = &OpenFile;
> print "drc[$drc]\n";# debug
>   chdir($drc); # $drc に日本語が有っても、移動できる
>   opendir(DIR,".");
>   @f1 = grep(/^[^\.]/i,readdir(DIR));
>   closedir(DIR);
>   $m1 = '\.doc|\.xls|\.ppt|\.jpg';
>   @f2 = grep(/($m1)$/i,@f1);
> print "f2[@f2]\n";# debug
>   for (@f2) {
>     next if /^\d{8,14}/;
>     next if /\.pl$/i;
>     @f_s      = stat($_);
>     @time     = localtime($f_s[9]); #作成日付
>     @time     = reverse(@time);
>     $time[3] += 1900;
>     $time[4] += 1;
>     $oldfile  = $newfile  = $_;
>     $newfile  = sprintf("%4s%02s%02s_",@time[3..5]) . $_;
>     print "old_file[" , $oldfile ,"]\nnew_file[" , $newfile ,"]\n";#<stdin>;
>     rename($oldfile,$newfile);
>   }
>   chdir("..")
> }
> 
> 
> 


-- 
木村浩一/KIMURA Koichi
 I thought what I'd do was, I'd pretend I was one of those deaf-mutes or
shoud I?
 mail kbk at kt.rim.or.jp
 web  www.kt.rim.or.jp/~kbk/zakkicho/index.html