WineでのWindowsプログラムエミュレーションはファイル名長には気をつけて

あまりないとは思いますが、Wineを使っていると時々忘れそうになる現象なので気をつけましょう、と言うやつです。

正しくはWineが悪い訳ではないですが・・・。

Windowsで使用されるファイルシステムとLinuxでよく使用されるファイルシステムのちょっとした問題

Windowsで使用されるファイルシステムは基本的にNTFSで、Linuxでよく使用されるファイルシステムはext4などとなっています。

他にもbtrfsやXFSなどはありますが、今回の場合で問題となる性質は共通なので気にしないことにします。

で、何が問題になるかというと、「扱える最大ファイル名長が実は違う」という問題です。

両方とも十分な文字数があるのでは?

Wikipediaあたりで比較表を拾ってくれば分かると思いますが、

ファイルシステム 最大ファイル名長
NTFS 255文字
ext3 255byte
ext4 256byte
btrfs 255byte
XFS 255byte

何か微妙に表記が違いますよね?

このあたりがものすごいくせ者です。

ext4などのファイルシステムではファイル名の文字コードをUTF-8として扱っている

のですね。(=(正しく言うと対象のOSが標準で使っている文字コード、ですが・・・。)=)とすると、確かに半角英数字や主な半角記号のファイル名なら両方のファイル名の最大長は同じです。

が、日本語などの全角文字が入ると話が別になります。

通常、UTF-8ではひらがなや漢字の文字コードはだいたい3byteになることが多いです。

NTFSではちゃんと「文字」と書いてあり、実際にこの「文字」はUTF-16単位で扱われるのでひらがなやカタカナ、ほとんどの漢字では1文字とカウントされます。

つまり、日本語など全角文字のファイル名はLinux系のファイルシステムでは1/3までの長さしか扱えない

と言うことが起こります。Windows環境で全角文字であまりに長すぎるファイル名をつけて保存していて、さてLinuxサーバーにSamba経由でコピーを、

と思ったときにエラーが出てコピーできなくなる原因でもあります。

そんな長いファイル名をつける方が間違いなのかもしれませんが、変に書類などで長いファイル名をつけざるを得なくなったときに困ってしまうわけですね。

(上司なんかへの説明で日本語で長いファイル名を使う、と言うことは十分にあり得ることですので)

で、これがどうしてWineと関係があるかというと

WineはWinAPIをエミュレーションすることでWindowsプログラムを強制的に対象OS上で動作させるための物なのですが、

普通、WindowsプログラムはUNICODEベースで組まれているとき、だいたいがこの制限で検査されます。

実際、Windowsのパス最大長としてよく使われていたMAX_PATHの定義は260であり、それをWCHARで定義して使う、と言うことが多いです。

そうなると、プログラム上ではチェックを通過出来るわけですが、WinAPIのエミュレーション(Linux上でCreateFileをエミュレーションしようとする)時に

ext4上などではファイル名が長すぎて作成不可能、というエラーを返さざるを得なくなるわけですね。

プログラムによってはこのようなエラーとなることを理解していない物があるかもしれませんのでWineでは長いファイル名を扱わないように、と言うやつですね。

そうなるとどうすれば?

素直にKVMあたりで仮想マシンを動かしましょう。

WinXP位ならいまならライセンスくらい余っているでしょうし。

ちなみに、DVD-ROMやBD-ROMのファイルフォーマットであるUDFにも似たような制限があります。

そのため、全角文字が長すぎるとファイル名が怪しくなりますので気をつけましょう~

コメントを残す

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

この記事のトラックバック用URL