protected function moveUpSectionDirectories_clbk($m)
 {
     $prefix = $m[1];
     $dir = $m[2];
     $file_path = $m[3];
     $suffix = $m[4];
     $root_dir = $this->getTempDir() . '/course_files';
     // ファイル移動
     SharingCart_FileSystem::move($root_dir . '/' . $dir . '/' . $file_path, $root_dir . '/' . $file_path, SharingCart_FileSystem::OVERWRITE);
     // ディレクトリが空になったら削除する
     SharingCart_FileSystem::rmdir($root_dir . '/' . $dir);
     return $prefix . $file_path . $suffix;
 }
    protected function excludeUnnecessaryDuplications()
    {
        global $CFG;
        if ($this->prefs->original_wwwroot != $CFG->wwwroot) {
            // サイトが異なる場合は同一のID値でリストアされる可能性があるのでファイルを除外しない
            return;
        }
        // 問題が新規作成されなかった場合、project フォーマットのリストア先セクションディレクトリに
        // メディアファイルをコピーすると参照されることなく冗長となってしまうので、ここで除外する
        if ($section_name = $this->prefs->newdirectoryname) {
            // 複製されなかった問題
            $no_dup_course_questions = get_records_sql("\n\t\t\t\tSELECT q.*\n\t\t\t\t\tFROM {$CFG->prefix}question            q\n\t\t\t\t\t   , {$CFG->prefix}backup_ids          bk\n\t\t\t\t\t   , {$CFG->prefix}question_categories qc\n\t\t\t\t\tWHERE bk.backup_code = " . $this->getUnique() . "\n\t\t\t\t\t  AND bk.table_name  = 'question'\n\t\t\t\t\t  AND bk.new_id      = bk.old_id\n\t\t\t\t\t  AND q.id           = bk.new_id\n\t\t\t\t\t  AND q.category     = qc.id\n\t\t\t\t\t  AND qc.contextid  != " . SYSCONTEXTID . "\n\t\t\t");
            if ($no_dup_course_questions) {
                $no_dup_course_question_ids = array_keys($no_dup_course_questions);
                $xml = file_get_contents($this->getTempDir() . '/moodle.xml');
                // ネストした内側にはマッチさせずに <QUESTION> ノードで分割
                $re_question_tag = '@
					<QUESTION>(
						(?:
							(?> (?: (?! </?QUESTION>). )* )
							|
							(?R)
						)*
					)</QUESTION>
				@xs';
                $a = preg_split($re_question_tag, $xml, -1, PREG_SPLIT_DELIM_CAPTURE);
                $re_file_refs = array('@&quot;' . preg_quote(parent::LINK_FILE_ESC, '@') . '/' . preg_quote($section_name, '@') . '/(.+?)&quot;@', '@<REFERENCE>' . preg_quote($section_name, '@') . '/(.+?)</REFERENCE>@');
                // コピー不要なファイルを列挙
                $exclude_flags = array();
                foreach ($a as $i => $s) {
                    if ($i & 1) {
                        // 奇数インデックス:マッチ
                        if (preg_match('@^\\s*<ID>(?:' . implode('|', $no_dup_course_question_ids) . ')</ID>@', $s)) {
                            // 複製されなかった問題 → 除外フラグを立てる
                            self::findLinksAndSetFlags($exclude_flags, $re_file_refs, $s, TRUE);
                        } else {
                            // 複製された問題       → 除外フラグを消す
                            self::findLinksAndSetFlags($exclude_flags, $re_file_refs, $s, FALSE);
                        }
                    } else {
                        // 偶数インデックス:非マッチ
                        // (QUESTION以外のファイル) → 除外フラグを消す
                        self::findLinksAndSetFlags($exclude_flags, $re_file_refs, $s, FALSE);
                    }
                }
                $exclude_files = array_keys(array_filter($exclude_flags));
                // コピー不要なファイルを一時ディレクトリから削除
                $root = $this->getTempDir() . '/course_files/' . $section_name . '/';
                foreach ($exclude_files as $file) {
                    SharingCart_FileSystem::remove($root . $file);
                }
                SharingCart_FileSystem::rmdir($root);
            }
        }
    }