2005/05/23(月) [n年前の日記]
#8 [prog][windows] 0x5C問題をチェック
ひとまず、perl、ruby、python で動作の違いを確認してみたり。
環境は、WinXP Home SP2。テストしたディレクトリの中は、こんな感じ。
環境は、WinXP Home SP2。テストしたディレクトリの中は、こんな感じ。
H:/temp2/strigcmptest/ ├ t.txt ├ test.pl ├ test.rb ├ あ/ ├ ソ/ ├ 能/ ├ 表/ └ 法/漢字で名前がつけられてるのが、ディレクトリ。おそらく、「ソ」「能」「表」がヤバゲ。2バイト目が 0x5C だから。
◎ perlで動作確認 :
Active Perl 5.8.6 build 811 を使用。
こんな感じのスクリプトで。
少し修正して試してみた。
結果。
ちなみに、s/\\/\\\\/g を入れる方法も試してみたけど、そちらも一応大丈夫だった。
こんな感じのスクリプトで。
#!/usr/bin/perl &get_filelist(@ARGV); exit 0; sub get_filelist { my($path) = @_; opendir DH, $path || die "Can't open $path"; foreach my $f (readdir DH) { next if $f =~ /^\.{1,2}$/; if ( -d "$path/$f" ) { print "[D] $f\n"; } else { print "[f] $f\n"; } } close DH; }結果。
H:\temp2\strigcmptest>test.pl . [f] ソ [f] 能 [D] 法 [D] あ [f] t.txt [f] test.rb [f] test.pl [f] 表よろしくない。「ソ」「能」「表」がディレクトリとして認識されてない。おそらくだけど、「そんな名前の(ファイル|ディレクトリ)は無い」ということで、 if 〜 else 〜 の、else まで流れてきてるのだろうと。
少し修正して試してみた。
#!/usr/bin/perl &get_filelist(@ARGV); exit 0; sub get_filelist { my($path) = @_; opendir DH, $path || die "Can't open $path"; foreach my $f (readdir DH) { next if $f =~ /^\.{1,2}$/; $f .= "/"; # 追加 if ( -d "$path/$f" ) { print "[D] $f\n"; } else { print "[f] $f\n"; } } close DH; }-d で、ディレクトリかどうかチェックする前に、"/" を最後に付け足してみたり。
結果。
H:\temp2\strigcmptest>test.pl . [D] ソ/ [D] 能/ [D] 法/ [D] あ/ [f] t.txt/ [f] test.rb/ [D] 表/ [f] test.pl/今度は大丈夫。
ちなみに、s/\\/\\\\/g を入れる方法も試してみたけど、そちらも一応大丈夫だった。
◎ rubyで動作確認 :
何の版の ruby を入れたのだったか、忘れてしまったけど。こんな感じの表示。
スクリプトはこんな感じ。
さておき、結果。
関係ないけど。FileTest.directory?(f) で、ディレクトリかどうか判別できてるのが不思議。「サブディレクトリ名を渡してるだけ」のはずなのに。もしかして、flst = d.entries で、(サブディレクトリ名|ファイル名)と一緒にフルパスも得られていて、それを使って判別してるのかしら? いや、もしかすると、flst = d.entries の時点で属性まで得ているのかな。前者と後者で、その後に書くべき処理も変わってきそうなので、少し気になるところ。
H:\temp2\strigcmptest>ruby -v ruby 1.8.2 (2004-12-25) [i386-mswin32]HDDの中を眺めた限りでは…もしかして、ActiveScriptRuby かしら。ちょっと自信なし。
スクリプトはこんな感じ。
#!/usr/bin/ruby def get_filelist(path) d = Dir.open(path) flst = d.entries flst.each do |f| next if f =~ /^\.{1,2}$/ if FileTest.directory?(f) then printf("[D] %s\n",f) else printf("[f] %s\n",f) end end end get_filelist(ARGV.shift)…ruby は全然判らないので、「ダメだダメだ、そんな書き方じゃ! このように書くのが ruby風!」てのがあったらご教授プリーズです。
さておき、結果。
H:\temp2\strigcmptest>test.rb . [D] ソ [D] 能 [D] 法 [D] あ [f] t.txt [f] test.rb [D] 表 [f] test.plわ。全く間違えてない。素晴らしい!
関係ないけど。FileTest.directory?(f) で、ディレクトリかどうか判別できてるのが不思議。「サブディレクトリ名を渡してるだけ」のはずなのに。もしかして、flst = d.entries で、(サブディレクトリ名|ファイル名)と一緒にフルパスも得られていて、それを使って判別してるのかしら? いや、もしかすると、flst = d.entries の時点で属性まで得ているのかな。前者と後者で、その後に書くべき処理も変わってきそうなので、少し気になるところ。
◎ pythonで動作確認 :
pythonは全くの未経験なのだけど。
_Cafe de Paison
の
_Python超簡易イントロダクション その3
を参考に、というかコピペさせてもらって試してみたり。
ActivePython 2.4 を使用。
スクリプトはこんな感じ。
さて、python の場合、どうやって解決したらいいのやら…。SJIS対応版をインストールし直さないとダメとか? うーん。他に手がありそうな気もするけど…。
ActivePython 2.4 を使用。
スクリプトはこんな感じ。
#! /usr/bin/python # -*- coding: shift_jis -*- import sys, os def get_filelist(path) : if not os.path.isdir(path) : print "Error: Not dir ",path sys.exit(2) try : flst = os.listdir(path) except OSError, e : print "Error: Can't open ",path sys.exit(3) print flst for e in flst : fullpath = os.path.join(path,e) if os.path.isfile(fullpath) : print "[f] ",e elif os.path.isdir(fullpath) : print "[D] ",e else : print "[x] ",e get_filelist(sys.argv[1]) sys.exit(0)結果。
H:\temp2\strigcmptest>test.py . ['\x83\\', '\x94\\', '\x96@', '\x82\xa0', 't.txt', '\x95\\', 'test.pl', 'test.rb', 'test.py'] [x] ソ [x] 能 [D] 法 [D] あ [f] t.txt [x] 表 [f] test.pl [f] test.rb [f] test.pyperlと同じ。2バイト目が0x5Cの漢字を使ってると、判別ができない。
さて、python の場合、どうやって解決したらいいのやら…。SJIS対応版をインストールし直さないとダメとか? うーん。他に手がありそうな気もするけど…。
◎ まとめ :
日本語版のWindows環境において。perl と python は、日本語を使ったファイル名 or ディレクトリ名の扱いに問題が出る可能性がある。ので、何かしら工夫が必要と。しかし、ruby ならそのへん問題が出ないかもと。
作者が「Windows は知らん」と公言する ruby が、最も、日本語版Windowsのことを考えてる(?)というのが、なんだか面白いというか、作者さん&コミュニティはスゴイというか、日本人が作っただけのことはあるというか、そんなことを思ったりもして。
作者が「Windows は知らん」と公言する ruby が、最も、日本語版Windowsのことを考えてる(?)というのが、なんだか面白いというか、作者さん&コミュニティはスゴイというか、日本人が作っただけのことはあるというか、そんなことを思ったりもして。
[ ツッコむ ]
以上です。