sfDirChildExists($dir)) { $arrTree[$cnt]['type'] = '_parent'; } else { $arrTree[$cnt]['type'] = '_child'; } $arrTree[$cnt]['path'] = $dir; $arrTree[$cnt]['rank'] = 0; $arrTree[$cnt]['count'] = $cnt; // 初期表示はオープン if ($_POST['mode'] != '') { $arrTree[$cnt]['open'] = $this->lfIsFileOpen($dir, $tree_status); } else { $arrTree[$cnt]['open'] = true; } $cnt++; $this->sfGetFileTreeSub($dir, $default_rank, $cnt, $arrTree, $tree_status); return $arrTree; } /** * ツリー生成用配列取得(javascriptに渡す用). * * @param string $dir ディレクトリ * @param string $default_rank デフォルトの階層 * (/区切りで 0,1,2・・・とカウント) * @param integer $cnt 連番 * @param string $tree_status 現在のツリーの状態開いているフォルダのパスが * | 区切りで格納 * @return array ツリー生成用の配列 */ public function sfGetFileTreeSub($dir, $default_rank, &$cnt, &$arrTree, $tree_status) { if (file_exists($dir)) { $handle = opendir($dir); if ($handle) { $arrDir = array(); while (false !== ($item = readdir($handle))) $arrDir[] = $item; // アルファベットと数字でソート natcasesort($arrDir); foreach ($arrDir as $item) { if ($item != '.' && $item != '..') { // 文末の/を取り除く $dir = rtrim($dir, '/'); $path = $dir.'/'.$item; // ディレクトリのみ取得 if (is_dir($path)) { $arrTree[$cnt]['path'] = $path; if ($this->sfDirChildExists($path)) { $arrTree[$cnt]['type'] = '_parent'; } else { $arrTree[$cnt]['type'] = '_child'; } // 階層を割り出す $arrCnt = explode('/', $path); $rank = count($arrCnt); $arrTree[$cnt]['rank'] = $rank - $default_rank + 1; $arrTree[$cnt]['count'] = $cnt; // フォルダが開いているか $arrTree[$cnt]['open'] = $this->lfIsFileOpen($path, $tree_status); $cnt++; // 下層ディレクトリ取得の為、再帰的に呼び出す $this->sfGetFileTreeSub($path, $default_rank, $cnt, $arrTree, $tree_status); } } } } closedir($handle); } } /** * 指定したディレクトリ配下にファイルがあるかチェックする. * * @param string ディレクトリ * @return bool ファイルが存在する場合 true */ public function sfDirChildExists($dir) { if (file_exists($dir)) { if (is_dir($dir)) { $handle = opendir($dir); while ($file = readdir($handle)) { // 行末の/を取り除く $dir = rtrim($dir, '/'); $path = $dir.'/'.$file; if ($file != '..' && $file != '.' && is_dir($path)) { return true; } } } } return false; } /** * 指定したファイルが前回開かれた状態にあったかチェックする. * * @param string $dir ディレクトリ * @param string $tree_status 現在のツリーの状態開いているフォルダのパスが * | 区切りで格納 * @return bool 前回開かれた状態の場合 true */ public function lfIsFileOpen($dir, $tree_status) { $arrTreeStatus = explode('|', $tree_status); if (in_array($dir, $arrTreeStatus)) { return true; } return false; } /** * ファイルのダウンロードを行う. * * @param string $file ファイルパス * @return void */ public function sfDownloadFile($file) { // ファイルの場合はダウンロードさせる $file_name = basename($file); header('Content-disposition: attachment; filename=' . $file_name); header('Content-type: application/octet-stream; name=' . $file_name); header('Cache-Control: '); header('Pragma: '); echo ($this->sfReadFile($file)); } /** * ファイル作成を行う. * * @param string $file ファイルパス * @param integer $mode パーミッション * @return bool ファイル作成に成功した場合 true */ public function sfCreateFile($file, $mode = '') { // 行末の/を取り除く if ($mode != '') { $ret = @mkdir($file, $mode); } else { $ret = @mkdir($file); } return $ret; } /** * ファイル読込を行う. * * @param string ファイルパス * @return string ファイルの内容 */ public function sfReadFile($filename) { $str = ''; // バイナリモードでオープン $fp = @fopen($filename, 'rb'); //ファイル内容を全て変数に読み込む if ($fp) { $str = @fread($fp, filesize($filename)+1); } @fclose($fp); return $str; } /** * ファイル書込を行う. * * @param string $filename ファイルパス * @param string $value 書き込み内容 * @return boolean ファイルの書き込みに成功した場合 true */ public function sfWriteFile($filename, $value) { if (!is_dir(dirname($filename))) { SC_Utils_Ex::recursiveMkdir(dirname($filename), 0777); } $fp = fopen($filename,'w'); if ($fp === false) { return false; } if (fwrite($fp, $value) === false) { return false; } return fclose($fp);; } /** * ユーザが作成したファイルをアーカイブしダウンロードさせる * TODO 要リファクタリング * @param string $dir アーカイブを行なうディレクトリ * @param string $template_code テンプレートコード * @return boolean 成功した場合 true; 失敗した場合 false */ public function downloadArchiveFiles($dir, $template_code) { // ダウンロードされるファイル名 $dlFileName = 'tpl_package_' . $template_code . '_' . date('YmdHis') . '.tar.gz'; $debug_message = $dir . ' から ' . $dlFileName . " を作成します...\n"; // ファイル一覧取得 $arrFileHash = SC_Helper_FileManager_Ex::sfGetFileList($dir); $arrFileList = array(); foreach ($arrFileHash as $val) { $arrFileList[] = $val['file_name']; $debug_message.= '圧縮:'.$val['file_name']."\n"; } GC_Utils_Ex::gfPrintLog($debug_message); // ディレクトリを移動 chdir($dir); // 圧縮をおこなう $tar = new Archive_Tar($dlFileName, true); if ($tar->create($arrFileList)) { // ダウンロード用HTTPヘッダ出力 header("Content-disposition: attachment; filename=${dlFileName}"); header("Content-type: application/octet-stream; name=${dlFileName}"); header('Cache-Control: '); header('Pragma: '); readfile($dlFileName); unlink($dir . '/' . $dlFileName); return true; } else { return false; } } /** * tarアーカイブを解凍する. * * @param string $path アーカイブパス * @return boolean Archive_Tar::extractModify()のエラー */ public function unpackFile($path) { // 圧縮フラグTRUEはgzip解凍をおこなう $tar = new Archive_Tar($path, true); $dir = dirname($path); $file_name = basename($path); // 拡張子を切り取る $unpacking_name = preg_replace("/(\.tar|\.tar\.gz)$/", '', $file_name); // 指定されたフォルダ内に解凍する $result = $tar->extractModify($dir. '/', $unpacking_name); GC_Utils_Ex::gfPrintLog('解凍:' . $dir.'/'.$file_name.'->'.$dir.'/'.$unpacking_name); // フォルダ削除 SC_Helper_FileManager_Ex::deleteFile($dir . '/' . $unpacking_name); // 圧縮ファイル削除 unlink($path); return $result; } /** * 指定されたパスの配下を再帰的に削除. * * @param string $path 削除対象のディレクトリまたはファイルのパス * @param boolean $del_myself $pathそのものを削除するか. true なら削除する. * @return void */ public function deleteFile($path, $del_myself = true) { $flg = false; // 対象が存在するかを検証. if (file_exists($path) === false) { GC_Utils_Ex::gfPrintLog($path . ' が存在しません.'); } elseif (is_dir($path)) { // ディレクトリが指定された場合 $handle = opendir($path); if (!$handle) { GC_Utils_Ex::gfPrintLog($path . ' が開けませんでした.'); } while (($item = readdir($handle)) !== false) { if ($item === '.' || $item === '..') continue; $cur_path = $path . '/' . $item; if (is_dir($cur_path)) { // ディレクトリの場合、再帰処理 $flg = SC_Helper_FileManager_Ex::deleteFile($cur_path); } else { // ファイルの場合、unlink $flg = @unlink($cur_path); } } closedir($handle); // ディレクトリを削除 GC_Utils_Ex::gfPrintLog($path . ' を削除します.'); if ($del_myself) { $flg = @rmdir($path); } } else { // ファイルが指定された場合. GC_Utils_Ex::gfPrintLog($path . ' を削除します.'); $flg = @unlink($path); } return $flg; } }