2005年09月30日
川俣晶の縁側ソフトウェアその他開発日誌 total 6404 count

長いファイル名を処理する際、du for Win32でエラー234が発生する問題

Written By: 川俣 晶連絡先

現象 §

 du for Win32で、以下のような問題が発生していました。

極端に長いファイル名のファイルを含むディレクトリを処理させると、エラー234の致命的なエラーが発生する

原因 §

 Win32 APIのFindFirstFile, FindNextFile等は、結果をWIN32_FIND_DATA構造体で受け取ります。このとき、取得するファイルの長さの上限は、構造体の定義により、固定値が与えられます。

 さて、これらのAPIにはUnicode版と、ANSI版が存在します。

 ANSI版を使用し、シフトJISでファイル名を取得する場合、ファイルシステムに保存されたUnicodeのファイル名がシフトJISに変換されます。

 その際、ANSI版ではUnicode版の半分の容量しか確保されていないにもかかわらず、それより大きなサイズの文字列に変換される場合があります。

 このようなケースでは、ファイル名を完全に取得できず、Win32の234番のエラー(ERROR_MORE_DATA, More data is available.)になります。 

解決 §

 これらのAPIのUnicodeバージョンを使用すれば解決します。

 そこで、Unicodeビルドをバージョン0.9として作成しました。

 以下がそれにあたります。

du for Win32 Version 0.9

制限事項 §

 Unicodeビルドは、Windows 9X/MEで動作しないと思われます。

 Windows 9X/MEでの利用を希望する場合は、バージョン0.8までを使用して下さい。

 ちなみに、バージョン0.8は以下より取得できます。

du for Win32 Version 0.8

 ただし、バージョン0.8には、du -?で表示されるバージョンが0.7になっているという情けないバグが存在することが確認されています。