毎度、お世話になります。
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("..")
}