mieki256's diary



2005/05/23(月) [n年前の日記]

#8 [prog][windows] 0x5C問題をチェック

ひとまず、perl、ruby、python で動作の違いを確認してみたり。

環境は、WinXP Home SP2。テストしたディレクトリの中は、こんな感じ。
H:/temp2/strigcmptest/
 ├ t.txt
 ├ test.pl
 ├ test.rb
 ├ あ/
 ├ ソ/
 ├ 能/
 ├ 表/
 └ 法/
漢字で名前がつけられてるのが、ディレクトリ。おそらく、「ソ」「能」「表」がヤバゲ。2バイト目が 0x5C だから。

perlで動作確認 :

Active Perl 5.8.6 build 811 を使用。

こんな感じのスクリプトで。
#!/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 を入れたのだったか、忘れてしまったけど。こんな感じの表示。
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 を使用。

スクリプトはこんな感じ。
#! /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.py
perlと同じ。2バイト目が0x5Cの漢字を使ってると、判別ができない。

さて、python の場合、どうやって解決したらいいのやら…。SJIS対応版をインストールし直さないとダメとか? うーん。他に手がありそうな気もするけど…。

まとめ :

日本語版のWindows環境において。perl と python は、日本語を使ったファイル名 or ディレクトリ名の扱いに問題が出る可能性がある。ので、何かしら工夫が必要と。しかし、ruby ならそのへん問題が出ないかもと。

作者が「Windows は知らん」と公言する ruby が、最も、日本語版Windowsのことを考えてる(?)というのが、なんだか面白いというか、作者さん&コミュニティはスゴイというか、日本人が作っただけのことはあるというか、そんなことを思ったりもして。

以上です。

過去ログ表示

Prev - 2005/05 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project