Source for file SC_Helper_FileManager.php

Documentation is available at SC_Helper_FileManager.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. // {{{ requires
  25. require_once(dirname(__FILE__'/../../module/Tar.php');
  26.  
  27. /**
  28.  * ファイル管理 のヘルパークラス.
  29.  *
  30.  * @package Page
  31.  * @author LOCKON CO.,LTD.
  32.  * @version $Id: SC_Helper_FileManager.php 17114 2008-03-10 01:42:58Z pineray $
  33.  */
  34.  
  35.     /**
  36.      * 指定パス配下のディレクトリ取得する.
  37.      *
  38.      * @param string $dir 取得するディレクトリパス
  39.      * @return void 
  40.      */
  41.     function sfGetFileList($dir{
  42.         $arrFileList array();
  43.         $arrDirList array();
  44.  
  45.         if (is_dir($dir)) {
  46.             if ($dh opendir($dir)) {
  47.                 $cnt 0;
  48.                 // 行末の/を取り除く
  49.                 while (($file readdir($dh)) !== false$arrDir[$file;
  50.                 $dir ereg_replace("/$"""$dir);
  51.                 // アルファベットと数字でソート
  52.                 natcasesort($arrDir);
  53.                 foreach($arrDir as $file{
  54.                     // ./ と ../を除くファイルのみを取得
  55.                     if($file != "." && $file != ".."{
  56.  
  57.                         $path $dir."/".$file;
  58.                         // SELECT内の見た目を整えるため指定文字数で切る
  59.                         $file_name SC_Utils_Ex::sfCutString($fileFILE_NAME_LEN);
  60.                         $file_size SC_Utils_Ex::sfCutString($this->sfGetDirSize($path)FILE_NAME_LEN);
  61.                         $file_time date("Y/m/d"filemtime($path));
  62.  
  63.                         // ディレクトリとファイルで格納配列を変える
  64.                         if(is_dir($path)) {
  65.                             $arrDirList[$cnt]['file_name'$file;
  66.                             $arrDirList[$cnt]['file_path'$path;
  67.                             $arrDirList[$cnt]['file_size'$file_size;
  68.                             $arrDirList[$cnt]['file_time'$file_time;
  69.                             $arrDirList[$cnt]['is_dir'true;
  70.                         else {
  71.                             $arrFileList[$cnt]['file_name'$file;
  72.                             $arrFileList[$cnt]['file_path'$path;
  73.                             $arrFileList[$cnt]['file_size'$file_size;
  74.                             $arrFileList[$cnt]['file_time'$file_time;
  75.                             $arrFileList[$cnt]['is_dir'false;
  76.                         }
  77.                         $cnt++;
  78.                     }
  79.                 }
  80.                 closedir($dh);
  81.             }
  82.         }
  83.  
  84.         // フォルダを先頭にしてマージ
  85.         return array_merge($arrDirList$arrFileList);
  86.     }
  87.  
  88.     /**
  89.      * 指定したディレクトリのバイト数を取得する.
  90.      *
  91.      * @param string $dir ディレクトリ
  92.      * @return void 
  93.      */
  94.     function sfGetDirSize($dir{
  95.         $bytes 0;
  96.         if(file_exists($dir)) {
  97.             // ディレクトリの場合下層ファイルの総量を取得
  98.             if (is_dir($dir)) {
  99.                 $handle opendir($dir);
  100.                 while ($file readdir($handle)) {
  101.                     // 行末の/を取り除く
  102.                     $dir ereg_replace("/$"""$dir);
  103.                     $path $dir."/".$file;
  104.                     if ($file != '..' && $file != '.' && !is_dir($path)) {
  105.                         $bytes += filesize($path);
  106.                     else if (is_dir($path&& $file != '..' && $file != '.'{
  107.                         // 下層ファイルのバイト数を取得する為、再帰的に呼び出す。
  108.                         $bytes += $this->sfGetDirSize($path);
  109.                     }
  110.                 }
  111.             else {
  112.                 // ファイルの場合
  113.                 $bytes filesize($dir);
  114.             }
  115.         }
  116.         // ディレクトリ(ファイル)が存在しない場合は0byteを返す
  117.         if($bytes == ""$bytes 0;
  118.  
  119.         return $bytes;
  120.     }
  121.  
  122.     /**
  123.      * 指定したディレクトリ又はファイルを削除する.
  124.      *
  125.      * @param string $dir 削除するディレクトリ又はファイル
  126.      * @return void 
  127.      */
  128.     function sfDeleteDir($dir{
  129.         $arrResult array();
  130.         if(file_exists($dir)) {
  131.             // ディレクトリかチェック
  132.             if (is_dir($dir)) {
  133.                 if ($handle opendir("$dir")) {
  134.                     $cnt 0;
  135.                     while (false !== ($item readdir($handle))) {
  136.                         if ($item != "." && $item != ".."{
  137.                             if (is_dir("$dir/$item")) {
  138.                                 $this->sfDeleteDir("$dir/$item");
  139.                             else {
  140.                                 $arrResult[$cnt]['result'@unlink("$dir/$item");
  141.                                 $arrResult[$cnt]['file_name'"$dir/$item";
  142.                             }
  143.                         }
  144.                         $cnt++;
  145.                     }
  146.                 }
  147.                 closedir($handle);
  148.                 $arrResult[$cnt]['result'@rmdir($dir);
  149.                 $arrResult[$cnt]['file_name'"$dir/$item";
  150.             else {
  151.                 // ファイル削除
  152.                 $arrResult[0]['result'@unlink("$dir");
  153.                 $arrResult[0]['file_name'"$dir";
  154.             }
  155.         }
  156.  
  157.         return $arrResult;
  158.     }
  159.  
  160.     /**
  161.      * ツリー生成用配列取得(javascriptに渡す用).
  162.      *
  163.      * @param string $dir ディレクトリ
  164.      * @param string $tree_status 現在のツリーの状態開いているフォルダのパスを
  165.      *                             | 区切りで格納
  166.      * @return array ツリー生成用の配列
  167.      */
  168.     function sfGetFileTree($dir$tree_status{
  169.  
  170.         $cnt 0;
  171.         $arrTree array();
  172.         $default_rank count(split('/'$dir));
  173.  
  174.         // 文末の/を取り除く
  175.         $dir ereg_replace("/$"""$dir);
  176.         // 最上位層を格納(user_data/)
  177.         if($this->sfDirChildExists($dir)) {
  178.             $arrTree[$cnt]['type'"_parent";
  179.         else {
  180.             $arrTree[$cnt]['type'"_child";
  181.         }
  182.         $arrTree[$cnt]['path'$dir;
  183.         $arrTree[$cnt]['rank'0;
  184.         $arrTree[$cnt]['count'$cnt;
  185.         // 初期表示はオープン
  186.         if($_POST['mode'!= ''{
  187.             $arrTree[$cnt]['open'$this->lfIsFileOpen($dir$tree_status);
  188.         else {
  189.             $arrTree[$cnt]['open'true;
  190.         }
  191.         $cnt++;
  192.  
  193.         $this->sfGetFileTreeSub($dir$default_rank$cnt$arrTree$tree_status);
  194.  
  195.         return $arrTree;
  196.     }
  197.  
  198.     /**
  199.      * ツリー生成用配列取得(javascriptに渡す用).
  200.      *
  201.      * @param string $dir ディレクトリ
  202.      * @param string $default_rank デフォルトの階層
  203.      *                              (/区切りで 0,1,2・・・とカウント)
  204.      * @param integer $cnt 連番
  205.      * @param string $tree_status 現在のツリーの状態開いているフォルダのパスが
  206.      *                             | 区切りで格納
  207.      * @return array ツリー生成用の配列
  208.      */
  209.     function sfGetFileTreeSub($dir$default_rank&$cnt&$arrTree$tree_status{
  210.  
  211.         if(file_exists($dir)) {
  212.             if ($handle opendir("$dir")) {
  213.                 while (false !== ($item readdir($handle))) $arrDir[$item;
  214.                 // アルファベットと数字でソート
  215.                 natcasesort($arrDir);
  216.                 foreach($arrDir as $item{
  217.                     if ($item != "." && $item != ".."{
  218.                         // 文末の/を取り除く
  219.                         $dir ereg_replace("/$"""$dir);
  220.                         $path $dir."/".$item;
  221.                         // ディレクトリのみ取得
  222.                         if (is_dir($path)) {
  223.                             $arrTree[$cnt]['path'$path;
  224.                             if($this->sfDirChildExists($path)) {
  225.                                 $arrTree[$cnt]['type'"_parent";
  226.                             else {
  227.                                 $arrTree[$cnt]['type'"_child";
  228.                             }
  229.  
  230.                             // 階層を割り出す
  231.                             $arrCnt split('/'$path);
  232.                             $rank count($arrCnt);
  233.                             $arrTree[$cnt]['rank'$rank $default_rank 1;
  234.                             $arrTree[$cnt]['count'$cnt;
  235.                             // フォルダが開いているか
  236.                             $arrTree[$cnt]['open'$this->lfIsFileOpen($path$tree_status);
  237.                             $cnt++;
  238.                             // 下層ディレクトリ取得の為、再帰的に呼び出す
  239.                             $this->sfGetFileTreeSub($path$default_rank$cnt$arrTree$tree_status);
  240.                         }
  241.                     }
  242.                 }
  243.             }
  244.             closedir($handle);
  245.         }
  246.     }
  247.  
  248.     /**
  249.      * 指定したディレクトリ配下にファイルがあるかチェックする.
  250.      *
  251.      * @param string ディレクトリ
  252.      * @return bool ファイルが存在する場合 true
  253.      */
  254.     function sfDirChildExists($dir{
  255.         if(file_exists($dir)) {
  256.             if (is_dir($dir)) {
  257.                 $handle opendir($dir);
  258.                 while ($file readdir($handle)) {
  259.                     // 行末の/を取り除く
  260.                     $dir ereg_replace("/$"""$dir);
  261.                     $path $dir."/".$file;
  262.                     if ($file != '..' && $file != '.' && is_dir($path)) {
  263.                         return true;
  264.                     }
  265.                 }
  266.             }
  267.         }
  268.  
  269.         return false;
  270.     }
  271.  
  272.     /**
  273.      * 指定したファイルが前回開かれた状態にあったかチェックする.
  274.      *
  275.      * @param string $dir ディレクトリ
  276.      * @param string $tree_status 現在のツリーの状態開いているフォルダのパスが
  277.      *                             | 区切りで格納
  278.      * @return bool 前回開かれた状態の場合 true
  279.      */
  280.     function lfIsFileOpen($dir$tree_status{
  281.         $arrTreeStatus split('\|'$tree_status);
  282.         if(in_array($dir$arrTreeStatus)) {
  283.             return true;
  284.         }
  285.  
  286.         return false;
  287.     }
  288.  
  289.     /**
  290.      * ファイルのダウンロードを行う.
  291.      *
  292.      * @param string $file ファイルパス
  293.      * @return void 
  294.      */
  295.     function sfDownloadFile($file{
  296.         // ファイルの場合はダウンロードさせる
  297.         Header("Content-disposition: attachment; filename=".basename($file));
  298.         Header("Content-type: application/octet-stream; name=".basename($file));
  299.         Header("Cache-Control: ");
  300.         Header("Pragma: ");
  301.         echo ($this->sfReadFile($file));
  302.     }
  303.  
  304.     /**
  305.      * ファイル作成を行う.
  306.      *
  307.      * @param string $file ファイルパス
  308.      * @param integer $mode パーミッション
  309.      * @return bool ファイル作成に成功した場合 true
  310.      */
  311.     function sfCreateFile($file$mode ""{
  312.         // 行末の/を取り除く
  313.         if($mode != ""{
  314.             $ret @mkdir($file$mode);
  315.         else {
  316.             $ret @mkdir($file);
  317.         }
  318.  
  319.         return $ret;
  320.     }
  321.  
  322.     /**
  323.      * ファイル読込を行う.
  324.      *
  325.      * @param string ファイルパス
  326.      * @return string ファイルの内容
  327.      */
  328.     function sfReadFile($filename{
  329.         $str "";
  330.         // バイナリモードでオープン
  331.         $fp @fopen($filename"rb" );
  332.         //ファイル内容を全て変数に読み込む
  333.         if($fp{
  334.             $str @fread($fpfilesize($filename)+1);
  335.         }
  336.         @fclose($fp);
  337.  
  338.         return $str;
  339.     }
  340.     
  341.     /**
  342.      * ファイル書込を行う.
  343.      *
  344.      * @param string $filename ファイルパス
  345.      * @param string $value 書き込み内容
  346.      */
  347.     function sfWriteFile($filename$value{
  348.         $fp @fopen($filename"w");
  349.         // ファイルに書き込む
  350.         if($fp{
  351.             fwrite($fp$value);
  352.         }
  353.         @fclose($fp);
  354.     }
  355.  
  356.     /**
  357.      * ユーザが作成したファイルをアーカイブしダウンロードさせる
  358.      * TODO 要リファクタリング
  359.      * @param void 
  360.      * @return void 
  361.      */
  362.     function downloadArchiveFiles($dir{
  363.         $debug_message "";
  364.         // ダウンロードされるファイル名
  365.         $dlFileName 'tpl_package_' date('YmdHis''.tar.gz';
  366.         
  367.         // ファイル一覧取得
  368.         $arrFileHash SC_Utils::sfGetFileList($dir);
  369.         foreach($arrFileHash as $val{
  370.             $arrFileList[$val['file_name'];
  371.             $debug_message.= "圧縮:".$val['file_name']."\n";
  372.         }
  373.         GC_Utils::gfDebugLog($debug_message);        
  374.         
  375.         // ディレクトリを移動
  376.         chdir($dir);
  377.         // 圧縮をおこなう
  378.         $tar new Archive_Tar($dlFileNametrue);
  379.         $tar->create($arrFileList);
  380.         
  381.         // ダウンロード用HTTPヘッダ出力
  382.         header("Content-disposition: attachment; filename=${dlFileName}");
  383.         header("Content-type: application/octet-stream; name=${dlFileName}");
  384.         header("Content-Length: " filesize($dlFileName));
  385.         readfile($dlFileName);
  386.         unlink($dir "/" $dlFileName);
  387.         exit;
  388.     }
  389.  
  390.    /**
  391.      * tarアーカイブを解凍する.
  392.      *
  393.      * @param string $path アーカイブパス
  394.      * @return string Archive_Tar::extractModify()のエラー
  395.      */
  396.     function unpackFile($path{
  397.         // 圧縮フラグTRUEはgzip解凍をおこなう
  398.         $tar new Archive_Tar($pathtrue);
  399.         
  400.         $dir dirname($path);
  401.         $file_name basename($path);
  402.                 
  403.         // 拡張子を切り取る
  404.         $unpacking_name preg_replace("/(\.tar|\.tar\.gz)$/"""$file_name);
  405.     
  406.         // 指定されたフォルダ内に解凍する
  407.         $tar->extractModify($dir"/"$unpacking_name);
  408.         GC_Utils_Ex::gfPrintLog("解凍:" $dir."/".$file_name."->".$dir."/".$unpacking_name);
  409.         
  410.         // フォルダ削除
  411.         SC_Utils::sfDelFile($dir "/" $unpacking_name);
  412.         // 圧縮ファイル削除
  413.         unlink($path);
  414.     }
  415. }
  416. ?>

Documentation generated on Tue, 28 Apr 2009 18:13:29 +0900 by phpDocumentor 1.4.2