作者: 林 宏
日時: 2008/1/15(05:20)
毎度、お世話になります。

 Bruce さんは書きました (2008/01/13 00:36):

>それはSjiftJISの呪いとuse encodingの祟りです。
>> sub Add_Date {# ファイル名先頭に日付(20071010_XXXXXXXXX)の「20071010_」を付ける
>>   ($drc) = &OpenFile;
>>   chdir($drc); # $drc に日本語があると、移動できない

>ここで$drcはフラグつきUTF-8文字列ですよね。
>これを chdir に渡しても、よろしく変換してくれることはありません。
>そのため存在しないディレクトリに chir しようとすることになり、結果として
>失敗します。
snip
>このほかにも '\' の災いなんてのがありますので、use encoding を使って
>どうこうしようというのは激しくオススメできません。

use utf8;とuse Encode;で書き直してみたら無事うまくいったようです。
前にもスクリプトをこれで書いてみたのですが、うまくいかなかった。
理由は、何を [shiftjis]にして、何を[utf8]にしないといけないか判っていなかった。。。
もっと違う良い方法も有るのでしょうが、取り敢えず、クリアできました。
お手数をお掛けしました。どうも有難うございました。

参考でスクリプトを添付しておきます。

#----------------------------------
# This script is worted utf8
# Microsoft Windows Xp Professional 2002  Service Pack 2
# use ActiveState perl 5.8.8_build820
use Tk;
use utf8;
use Encode qw(from_to encode decode);
#------------------------------------------------------------------
$types = [['変更可能ファイル',['.jpg','.xls','doc',],],['全て','*'],];
#------------------------------------------------------------------
$mw = MainWindow->new;
$title ="ファイルズツールズ";
$mw->title($title);
$but10 = $mw->Button(
  -text    => "00:Exit!",
  -anchor  => 'center',
  -font    => "{MS 明朝} 16",
  -command => sub { exit;      }
)->pack(-side => right   ,-anchor => w,-fill => both);
$but04 = $mw->Button(
  -text    => "03:ファイル名の先頭に日付付加",
  -anchor  => 'w',
  -font    => "{MS 明朝} 16",
  -command => sub { &Add_Date; }
)->pack(-side => top     ,-anchor => w,-fill => both);
MainLoop;
# sub --------------------------------------------------------------------

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("..")
}