[Namazu-win32-users-ja 1256] Re: mknmzの処理が中断する

Tadamasa Teranishi yw3t-trns @ asahi-net.or.jp
2010年 10月 2日 (土) 19:13:02 JST


寺西です。

# 補足です。

Yukio USUDA wrote:
> 
> Unicode 系の API を使えばフルパスで 32,767 文字までつかえるようです。

ANSI 系APIの場合は _MAX_PATH = 260 文字まで使えます。
(Unicode 系APIでは _MAX_PATH の制限を受けません。)

なお、
ANSI 系API は 95系、NT系で使えますが、Unicode 系API は NT 系でのみ
サポートしています。

> NTFS 自体には長いパス名は作れるので
> cd で下のフォルダに移動しながら作成するとか
> フォルダごと下層フォルダにコピーするなどすれば
> かなり長いパス名が作れますが、

実際のところ作れないですね。
エクスプローラも cmd.exe も対応していないようです。(Windows XP の
場合ですが。)

# Word 2007, notepad もダメっぽい。ネットワークドライブなら可能かも
# しれないが、ローカルだとダメですね。

> できてしまったファイルには Unicode 系の API を使って作られた
> ツールでなければフルパス名でアクセスすることはできなくなります。

これはそうです。

# ただ、意外なことにエクスプローラや Word 2007 も対応していませんでし
た。
# びっくりです。
 
> 現行の MS-Windows 版の mknmz では Unicode 系の API は使用していない
> ためフルパス名 256 文字の制限に引っかかるものと思います。

結論からするとそうかもしれません。
(どこかの処理で引っかかっている可能性があります。)

ただ、ANSI 系API も _MAX_PATH の制限を受けるものも、それを無視するも
のもあるので、実は結構微妙な仕様なんですよね。
# Win32 API は、後付で建て増し増設し続けた仕様なんで、仕方ないか。

_MAX_PATH より長いパスは ANSI系 API では完全に対応していないとか
ならまだ楽なんですけど、微妙に対応しているものとかあったりして、
それを使おうとしてはまっているような気がしてきました。

が、フィルタから呼ばれる外部プログラムの全てが _MAX_PATH より長いパス
も扱えるようにできているかと考えると、それは無理そうです。

そういうことも含めて、
面倒なんで、いっそのこと _MAX_PATH より長いパスは全てエラーにした
方がすっきりしそうですね。
 
> 最近 Win32::Unicode というモジュールを見かけました。
> http://search.cpan.org/~xaicron/Win32-Unicode/
> http://perl-users.jp/articles/advent-calendar/2009/hacker/20.html
> これを用いれば "表" などの 0x5C を含む文字の問題も解消されるはずですし、
> 日本語に限らず多言語対応も考慮できるのかもしれません。
> ただ MS−Windows 環境に特化した改修になるので取り組むべきかどうか
> 難しいですね。

はい。2.0.X では無理ですが、2.2.X では入れるというのもありですかね。
その場合は、95系はもう過去の遺物なので切り捨てるという前提で。

実はその昔、Perl に -C オプションというのがあって、(現在は別のオプ
ションに変わっている)「Windows プラットホームにおいては, -C コマン
ドラインスイッチが使われているか, ${^WIDE_SYSTEM_CALLS} グローバル
フラグが 1 に設定されているのなら, すべてのシステムコールは対応する
ワイド文字の API を使います.」
となっており、ANSI 版ではなく Unicode 版が使えるような仕組みがあった
のですが、残念です。

http://namazu.asablo.jp/blog/2005/10/24/118708

${^WIDE_SYSTEM_CALLS} がなくなったと明記されてはいなかったように
思いますが、どうも一緒になくなったみたいでした。
 
> 当面の解決方法の一つとしては、
> Linux サーバ環境を用意して MS-Windows の共有フォルダをsmbfs で
> 文字コード EUC-JP でマウント
> # mount -t cifs -o codepage=cp932,iocharset=euc-jp,username=ユーザ名,password=パスワード,ro //サーバ名/フォルダ名 /mnt/winfolder
> 
> して Linux 側で mknmz を実行するというものがあります。

更に遅くなっちゃいそうですが、当面の対策としてはそれなりに有効ですね。
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns @ asahi-net.or.jp
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E


Namazu-win32-users-ja メーリングリストの案内