萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> 用PHP實現文件管理系統

用PHP實現文件管理系統

   

  /**

  * @]Class Name[= IO

  * @]Class URI[= System.IO

  * @]Purpose[=

  * 本類用於對文件系統的處理

  * @]Author[= SNakeVil <51JS,BU,PHPx> ([email protected])

  * @]Version[= 1.1.1

  * @]Create[= 17:13 2004-3-25

  * @]Modifications[=

  * 4:04 2004-3-30 "

  * + 修復 generate_path() 方法中存在的一些 BUG

  * + 重新設計方法 no_comment()

  * 4:32 2004-3-29

  * + 簡化方法 list_dir() 的返回值[

  * + 增加方法 file_info() 獲取文件或目錄信息

  * 5:35 2004-3-28

  * + 整理優化算法

  * 7:31 2004-3-27

  * + 將錯誤處理抽象為基類 pB

  * + 增加方法 no_comment() 刪除文件中 C 規范注釋

  * @]See[=

  */

  class IO extends SnkClass

  var $result; // 操作返回結果,如方法返回值為 mixed,則成功操作結果可在此獲得

  var $exec_cmd; // 執行方法,暫時沒應用到

  var $exist_dir; // 創建目錄時最後存在的目錄,現用於 copy() 和 move()

  var $buffer_size; // 文件讀取緩沖區大小,根據服務應用規模和服務器配置修改,建議默認值

  function IO()

  parent::SnkClass();

  $this->result = array();

  $this->exec_cmd = "";

  $this->exist_dir = "";

  $this->buffer_size = 8192;

  return $this;

  }

  /**

  * @]Method Name[= list_dir()

  * @]Purpose[=

  * 讀取指定目錄內容,返回內容數組

  * @]Parameter[=

  * string $dir_path 指定目錄路徑,默認為當前目錄

  * @]Return[= mixed 錯誤返回 FALSE,否則返回

  * array(

  * array("name","location","type"),

  * ......

  * )

  * @]Author[= SNakeVil <51JS,BU,PHPx> ([email protected])

  * @]See[=

  */

  function list_dir($path=".")

  if (!is_dir($path)) return $this->error_occur(0x000B, __FUNCTION__);

  if (!is_readable($path)) return $this->error_occur(0x0002, $path);

  $dh = @opendir($path);

  $result = array();

  $path = realpath($path);

  if ($path[strlen($path)-1]!=DIRECTORY_SEPARATOR) $path .= DIRECTORY_SEPARATOR; // 保證目錄絕對地址後帶目錄分隔符

  while (FALSE!==($fh=readdir($dh))) { // 使用 !== 防止處理名稱為 0 或 FALSE 的文件、目錄

  if ($fh=="."||$fh=="..") continue; // 忽略系統特定文件夾

  $i = $path.$fh; // 獲取絕對地址

  $t = array(

  "name" => $fh, V u,

  "location" => $i,

  "type" => is_file($i) ? 1 : (is_dir($i) ? 0 : -1)

  );

  $result[] = $t;

  }

  closedir($dh);

  unset($dh, $fh, $t, $i);

  clearstatcache(); // 清除文件系統緩存

  return $this->result = $result;

  }

  /**

  * @]Method Name[= file_info()

  * @]Purpose[=

  * 獲取指定文件或目錄的屬性

  * @]Parameter[=

  * string $dir_path 指定目錄路徑,默認為當前目錄

  * @]Return[= mixed 錯誤返回 FALSE,否則返回

  * array("name","location","type","size","access","change","modify","read","write"),

  * @]Author[= SNakeVil <51JS,BU,PHPx> ([email protected])

  * @]See[=

  */

  function file_info($path=".")

  $path = realpath($path);

  if (!$path) return $this->error_occur(0x000A, __FUNCTION__);

  $result = array(

  "name" => substr($path, strrpos($path, DIRECTORY_SEPARATOR)+1),

  "location" => $path, FHHC,~|5

  "type" => is_file($path) ? 1 : (is_dir($path) ? 0 : -1),

  "size" => filesize($path),

  "access" => fileatime($path),

  "modify" => filemtime($path),

  "change" => filectime($path),

  "read" => is_readable($path),

  "write" => is_writeable($path)

  );

  clearstatcache();

  return $this->result = $result;

  }

  /**

  * @]Method Name[= seek file()

  * @]Purpose[=

  * 根據正則表達式條件,在相應目錄及給定層次的子目錄中搜索匹配的文件、目錄

  * @]Parameter[=

  * string $pattern 兼容 PERL 標准的正則表達式指明搜索匹配要求,會添加 /^ $/,默認為 .*

  * string $path 進行搜索的目錄路徑,默認為當前路徑

  * enum $seesk_type 有 -1 0 1 三種可能值,0 僅文件夾,1 僅文件,-1 兩者都包括,默認為 1

  * int $sub_dir 搜索的子目錄深度,指定目錄不算,建議不要超過 5,默認為

  * limit $limit 搜索結果限制,避免過度浪費系統資源,默認為 100

  * @]Return[= mixed 錯誤返回 FALSE,否則

  * array(

  * array(

  * "name","locate","type"

  * ),

  * ......

  * )

  * @]Author[= SNakeVil <51JS,BU,PHPx> ([email protected])

  * @]See[=

  */

  function seek_file($pattern=".*", $path=".", $seek_type=1, $sub_dir_level=0, $limit=100)

  /* 檢查參數值 */

  $is_error = $seek_type!=1 && $seek_type!=0 && $seek_type!=-1;

  $is_error = $is_error && (!is_int($sub_dir_level) || $sub_dir_level < 0);

  $is_error = $is_error && (!is_int($limit) || $limit < 1);

  if ($is_error) return $this->error_occur(0x000B, __FUNCTION__);

  unset($is_error);

  $result = array();

  /* array() == FALSE,所以需要使用 === */

  if (FALSE===$i=$this->list_dir($path)) return FALSE; // 如果不能列舉目錄,返回

  for ($j=0,$k=count($i);$j<$k;$j++) {

  if ($i[$j]["type"]==-1) continue; // 對於非目錄非文件項目,跳過

  if ($i[$j]["type"]==0&&$sub_dir_level) { // 如果需要搜索下層目錄

  if (FALSE===$l=$this->seek_file($pattern,$i[$j]["location"],$seek_type,($sub_dir_level - 1),$limit)) return FALSE;

  $result = array_merge($result, $l); // 將下層目錄搜索結果添加

  }

  if ($seek_type+$i[$j]["type"]==1||!preg_match("/^".$pattern."$/", $i[$j]["name"])) continue; // 如果不搜索當前類型,跳過

  $result[] = $i[$j];

  if (count($result)>=$limit) { // 截去超過要求的長度,離開列舉

  array_splice($result, $limit);

  break;

  }

  }

  unset($i, $j, $k, $l);

  return $this->result = $result;

  }

  /**

  * @]Method Name[= delete()

  * @]Purpose[=

  * 刪除指定對象,文件或文件夾——包括內含子目錄和文件的非空文件夾

  * @]Parameter[=

  * string $path 指定要刪除的內容路徑,文件或目錄均可

  * @]Return[= boolean 錯誤返回 FALSE,否則 TRUE

  * @]Author[= SNakeVil <51JS,BU,PHPx> ([email protected])

  * @]See[=

  */

  function delete($path="") {

  $path = realpath($path);

  if (!$path) return $this->error_occur(0x000A, __FUNCTION__);

  if (!is_dir($path)) {

  if (@unlink($path)) return TRUE; // 文件刪除成功

  return $this->error_occur(0x0004, $path);

  } else {

  if (FALSE===$i=$this->list_dir($path)) return FALSE; // 不能列舉目錄

  for ($j=0,$k=count($i);$j<$k;$j++)

  if (!$this

copyright © 萬盛學電腦網 all rights reserved