作者: 林 宏
日時: 2008/1/12(23:43)
ご無沙汰してます。

Microsoft Windows Xp Professional 2002  Service Pack 2
Activeperl 5.8.8_build820
スクリプトを shift-jisで書いてます。
perl/tk でファイル(ディレクトリ)を読込んで
chdir($drc) しようと思うのですが、ディレクトリに日本語が
入っていると、ディレクトリに移動したり、ファイルが読込めません。

Googleで検索して、色々見ているのですが、参考になるものを
探しきれていません。
情報のポインタでも教えて頂けると幸いです。

久しぶりの発言がこんなので済みませんが。。。

参考でスクリプトを付けておきます。。。
#----------------------------------
# This script is worted shift-jis
# use ActiveState perl 5.8.8_build820
use Tk;
use Encode qw(from_to encode decode);
use encoding "shift-jis" ,Filter=>1; 
#------------------------------------------------------------------
$types = [['変更可能ファイル',['.jpg','.xls','doc',],],['全て','*'],];
#------------------------------------------------------------------
$mw = MainWindow->new;
$title ="ファイルズツールズ";# from_to($title,'shiftjis','utf8',); 
$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/\/[^\/]+$//;
    print "OpenDrc[$drc] を選択しました。[cr]";# <stdin>;
    return $drc;
  }
}

sub Add_Date {# ファイル名先頭に日付(20071010_XXXXXXXXX)の「20071010_」を付ける
  ($drc) = &OpenFile;
  chdir($drc); # $drc に日本語があると、移動できない
  opendir(DIR,".");
  @f1 = grep(/^[^\.]/i,readdir(DIR));
  closedir(DIR);
  $m1 = '\.doc|\.xls|\.ppt|\.jpg';
  @f2 = grep(/($m1)$/i,@f1);
  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]) . $_;
    $newfile  = $drc . $newfile;
    $newfile  = Encode::encode('Shift-JIS',$newfile);
    $oldfile  = $drc . $oldfile;
    $oldfile  = Encode::encode('Shift-JIS',$oldfile);
  print "[$oldfile] →[$newfile]\n";#<stdin>;
    rename($oldfile,$newfile);
  }
  chdir("..")
}