Just another Windows perl site

Windows perl で日本語パス名を処理するときの不具合対応

2018/04/13
 
この記事を書いている人 - WRITER -
*会社職務経歴  ・本店・安全・品質部長(2年)  ・ラインマン(送電線建設・保守)(30年)  ・情報システム(3年)

Windows perl で日本語パス名を処理するときの不具合対応について

スポンサードリンク

Windows activeperl で2バイト文字フォルダ名を処理するとき、不具があります。
原因は2バイト目に [0x5c]が有る日本語フォルダの区切りを間違えるからです。
この結果、[chdir] が、使用出来ません。

フォルダ操作時は必須ですから、致命的な欠陥です。
そこで、win32::api で応急処置をしました。

今までのはどうだったのか?

activeperlの5.16までは[win32-unicode]というモジュールが使えました。
activeperl5.18 位から使えないようになりました。

原因

・Windows は[Windows XP]の頃から、内部コードが[utf16-le] となっていたようです。
・windowsの[dir] なんかは、しっかり対応しているいますね。
・そうなると「ActivePerl が [utf16-le] に対応していないから?」だと思います。

対応

しょうがないので、自前(我流)でモジュールを作りました。
このモジュールは[win32-api」を使ったものです。
[win32-unicode]や海外の情報等を元に、対応モジュールを作りました。。

対応内容

スポンサードリンク

・ディレトリや、ディレトリに関するファイルの入出力は、[activeperl win32::API]を使用。

・[kernel32.dll]の[windows関数]は[ANSI版]ではなくて[Unicode版]を使用する。
で、対応できました。。。
*:但し、専門的な知識が足らないので、完璧では有りません。

このスクリプトを使っての「如何なる損傷・損害等」は、一切保証しません
使用前には、特にデータ等は、「必ずバックアップを取ってから」実行してください。

*スクリプトと説明

・「_func_U_116.read.me」は、作った関数を書いておきました。
・「_func_U_116.pl」は、おおもとのスクリプトです。
・「_func_U_116_dodir.pl」は、「_func_U_116.pl」を使用して、
直下の「ディレクトリとファイル名」をprint out するスクリプトです。
・「_func_U_116_dodir.pl」を起動させると、

「_func_U_116_dodir.txt」という

  ファイルを作成します。
この中に、直下の「ディレクトリとファイル名」をprint out します。

・このスクリプトは「GNU General Public License (GPL) 」および
「Artistic License(アーティスティック・ライセンス)」に従います。

*:誰かもっと完璧なものを、作ってください。。。。。

m(_ _)m:m(_ _)m:m(_ _)m

スクリプト

[ 20170101_funk_U_116.7z] 7zip で圧縮してあります。解凍してください。
20170101_funk_U_116.7z

スポンサードリンク


この記事を書いている人 - WRITER -
*会社職務経歴  ・本店・安全・品質部長(2年)  ・ラインマン(送電線建設・保守)(30年)  ・情報システム(3年)

Comment

  1. のぶ太 より:

    試してみたのですが、例えばカレントディレクトリにある「表」というフォルダにchdir_U()することができませんでした。何か間違いがあるでしょうか?

    #!perl
    require ‘./_func_U_116.pl’;
    use utf8;
    print `chdir`, “\n”;
    chdir_U(‘表’);
    print `chdir`, “\n”;
    __END__

  2. winperl01 より:

    ・結論から言うと
    ————————-
    print `chdir`, “\n”;
    ————————-

    ————————-
    $cd = &GetCurrentDirectory_U;
    print “\ncd[$cd][cr]”;;
    ————————-
    と、してみてください。
    [chdir(‘表’)」が動いているのがわかります。

    *このスクリプトの仕様前提をもっとわかりやすく書いておくべきでした。
     反省しています。

    ・このスクリプトの仕様前提は、「表等」「5c」を含むフォルダ(ディレクトリ)を読み書きするだけのための物です。
     (少なくと、本人は、そう思っている。。。)
    ・そのため、[perl の普通?のコマンド」とは、非常に相性が悪いです。
     多分単体で動かしても、満足な結果が得られないでしょう。。
    ・「_func_U_116_commandr.readme」にも書いておきましたが、
     とりあえず、作った関数
     cd :&GetCurrentDirectory_U;
     opendir :&opendir_U(‘./*.*’);
     readdir :&readdir_U($handle);
     closedir :&closedir_U($handle);
     attribute :&Attributes_U($_);
     chdir :&chdir_U($_);
     等と一緒に動かさないと、よい結果がでないでしょう。。

    ・まして、windows のコマンドの「、print `chdir`, “\n”;」は、ダメでしょう。。

    ・今後のことは、windows perl 側が対応してくれるのが一番ですが、あまり見込みはなさそうです。

    ・その次の要望は、私よりもっと分かった方が、対応してくださるのが一番(完全に他力本願)です。

    *コメントして頂いて申し訳ないのですが、今の現状です。
     よろしくお願いいたします。。

- Comments -

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Copyright© 仕事の進め方の効率化ブログ , 2017 All Rights Reserved.