日本語WindowsXP SP3上での検証結果です.
PHP5.2.8では問題ありません.
PHP5.3.5で発生します.PHP5.3.5はApacheと組み合わせて使用していますが,PHP本家にはApacheと組み合わせるためのVC6版のPHP5.3がありませんでしたので,moodle.orgのWindows版パッケージ(XAMPP)のPHPバイナリを利用しました.
現象は比較的シンプルかつ深刻で,日本語Windows上の日本語ファイル名にキャラクタコード5Cが含まれると,DirectoryIterator->isFile()が,ファイルであるにも関わらずfalseを返します.
この問題に気付いたのは,Moodle2.1.2(fs_moodle化の途中)でMoodle1.9.10のサイトをマイグレーションによりMoodle2形式に変換している最中のエラーでした.mod_scormの変換中に,
このようなエラーが発生しました.問題の個所のコードを調べたところ,moodle/mod/scorm/db/upgradelib.php中のfunction scorm_migrate_moddata_subdir()で発生しています.DirectoryIteratorで取得したアイテムを一つ一つ調べ,ファイルならば新しいファイルシステムにコピーし,アイテムがフォルダの場合は再帰呼び出しでscorm_migrate_moddata_subdir()を呼ぶ.ここでアイテムがファイルであるにも関わらず $item->isFile()がfalseとなるためフォルダであると勘違いされ,ファイル名をフォルダ名として再帰呼び出しするものの呼び出された先ではそれをフォルダとして認識できずにエラーになります.
具体的には,「ITセキュリティ評価・認証に関するe-Learning ―開発者(管理者)編―.hpc」というファイルで,この中の「―」がCP932(シフトJIS準拠)で 81 5C です.
Moodle2からはファイルシステムの仕様に依存しない新しいファイルシステムに変わったため,新規にインストールしたMoodle2ではこの問題は”ほぼ”発生しないと思います.しかし,Moodle1.9, 1.8の環境からMoodle2にアップグレードする際に,どうしても2バイト文字コード(CP932)のファイルへアクセスしなくてはならないでしょう.今回はSCORMのファイルにこの5Cを含むファイル名が運悪く存在しましたが,フォーラム投稿に添付したファイルやコースファイルなどに日本語文字を使用している場合,運悪くそれが5Cを含む文字を使っていると同じ問題が発生します.
なお,標準のMoodle1.9, 1.8を日本語Windows(Server含む)上で使用する場合,ファイル名に日本語が使用できないので,Moodle2にアップグレードするのにPHP5.3.5を使用しても問題は無いでしょう.非常に残念なのですが,日本語Windows上で日本語ファイル名を利用可能としたfs_moodleにおいてのみ発生する問題です.頭が痛いです.
もしmod_scormにおいてのみ発生する問題であればこの個所のみを改良すれば済むのですが…
一番好ましいのは,PHP5.3がこの5C問題のエンバグを解消してくれることです.どなたかこの問題について詳しい方,あるいは他にも問題になっているページなどをご存じではないでしょうか.
#PHPのソースを解析しようとして挫折しました…