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