Moodle1.8.9, Moodle1.9.5からlib/moodlelib.phpのfunction unzip_file()関数が大きく変わりました.どうやらこれはマルチバイト言語圏(Windows系)にとってプラスになる改善のようです.
いままでunzipする先のルートフォルダ名をpclzipライブラリにそのまま渡していました.もしパスに日本語が含まれる場合に,OSがWindowsの場合には正しく解凍できませんでした.今回の改善では,$destpathへ直接出力するのではなく,まず,
do {
$temppath = "$CFG->dataroot/temp/unzip/".random_string(10);
} while (file_exists($temppath));
if (!check_dir_exists($temppath, true, true)) {
return false;
}
このように安全な$temppathを作成し,そこをルートとするフォルダに一時的に展開します.その後,新しく追加された関数,function unzip_process_temp_dir($temppath, $destpath)でフォルダ構造を保ったまま移動します.
以前のMoodleのコーディングだと,copy()してからunlink()すると思うのですが,この関数ではrename()でフォルダ構造の底から上に向かって再帰的にバックトラックしながら”移動”して行きます.関数の構造としてはfunction fulldelete()あたりと良く似ています.unzip_file()の後処理用の関数として設計されていますが,もっと汎用的な関数で,共有しても良い便利な関数に見えるのですけれども.控えめですね^^.