error_reporting(2047);
/*
* Class IO (SNakeVil completed 03.25.04) (v1.0.0.0)
*
* [Description]
* This class is used to process the file system.
*
* [Function]
* **** list_dir($dir_path);
* Read the contents of the specified directory and return the content array.
* $dir_path string, specify the directory path
* If there is an error, return FALSE, otherwise return
* array(
* "count"=>array("files","dirs", "size"),
* "list"=>array(
* array("name","locate","type","size","last_access","last_change","last_modify" ),
* ......
* )
* )
* ********
* ********
* **** seek_file($pattern, $dir_path, $seek_type, $sub_dir, $internal, $limit);
* Search for matching files in the corresponding directory and subdirectories of a given level based on regular expression conditions ,Table of contents.
* $pattern is a regular expression that complies with PERL compatibility standards, no need to add //, the system adds it by itself
* $seek_type has three possible values -1 0 1, 0 only folders, 1 only files, -1 Both include
* $sub_dir numeric value, the depth of the subdirectory searched, the specified directory does not count, it is recommended not to exceed 5
* $internal Boolean value, if true, return the detailed information of the search results, otherwise only return File name, type and directory
* $limit numeric value, search result limit to avoid excessive waste of system resources
* Returns FALSE if there is an error, otherwise returns
* array(
* array(
* "name","locate","type"
* [,"size","last_access","last_change","last_modify"]
* ),
* .... ..
* )
* ********
* ********
* **** delete($path);
* Delete Specifies an object, file, or folder—including non-empty folders containing subdirectories and files.
* $path string, specify the content path to be deleted, either a file or directory
* If there is an error and interrupt at the error, return FALSE, otherwise return TRUE
* ******* *
* ********
* **** make_dir($path);
* Create any folder, either a relative or absolute path, or deep creation.
* $path string, the final directory path to be created
* Returns FALSE if there is an error, otherwise returns TRUE
* ********
* ****** **
* **** verify_file($src, $dst, $internal);
* Use MD5 algorithm to compare whether two files are the same.
* $src string, source file path
* $dst string, target file path
* $internal Boolean value, for files larger than 1M, it can be set to FALSE to save the MD5 verification step and reduce Server burden
* Returns FALSE if there is an error, otherwise returns TRUE
* ********
* ********
* **** copy($ src_path, $dst_path);
* Copy any folder or file, either a relative or absolute path. After the file copy is completed, it will be verified to check whether there are any errors or data errors.
* $src_path String, specifies the source content path to be copied, either a file or directory
* $dst_path String, specifies the target content path to be copied, either a file or directory, the nature is determined by $src_path , can be the lower directory of $src_path
* If there is an error, return FALSE, otherwise return TRUE
* ********
* ********
* ** ** move($src_path, $dst_path);
* Move any folder or file, either relative or absolute path. After the file move is completed, it will be verified to check whether there are any errors or data errors.
* $src_path String, specifies the source content path to be moved, either a file or directory
* $dst_path String, specifies the target content path to be moved, either a file or directory, the nature is determined by $src_path , can be $src_path lower directory
* Returns FALSE if there is an error, otherwise returns TRUE
*
* [Copyright]
* Independently designed by Fengyu Mingqing (SNakeVil@51js, SNakeVil@BU) , all rights reserved.
* Feel free to use it, but please do not keep the text below, thank you!
*
* ===========Z=================
* Class.IO.v1.0.0.0.build040325
* for.PHP.v4.20+
* by SNakeVil
* (snakevil@51js, snakevil@BU)
* --------+------
* QQ:118824
* MSN:snakevil_@hotmail.com
* HP:
http://www.snakevil.com/ * ===========Z=================
*
*/
class IO {
var $error_id;
var $result;
var $error_related;
var $last_exist_dir;
function IO() {
$this->result = array();
$this->error_id = 0x0000;
$this->error_related = "";
$this->last_exist_dir = "";
return $this;
}
function error_occur($error_id=0xffff,$error_related="") { // ----0xffff---- 发生错误,但错误原因未知
if (is_int($error_id)) $this->error_id = $error_id; // 获取错误号
$this->error_related = $error_related;
return false; // 错误发生时返回 FALSE 方便进一步处理
}
function list_dir($dir_path=".") {
if (!is_dir($dir_path)) return $this->error_occur(0x0001, $dir_path); // ----0x0001---- 指定目录不存在
if (!$dir_handle=@opendir($dir_path)) return $this->error_occur(0x0002, $dir_path); // ----0x0002---- 指定目录无权读取
$result = array(
"count" => array("files" => 0, "dirs" => 0, "size" => 0),
"list" => array()
);
while (false!==($file_handle=readdir($dir_handle))) { // 使用 !== 防止处理名称为 0 或 FALSE 的文件、目录
if ($file_handle=="."||$file_handle=="..") continue; // 忽略系统特定的两个文件夹
$temp = str_replace("", "/", realpath($dir_path));
$temp = substr($temp, -1)=="/" ? $temp : $temp."/";
$temp = array($temp, $file_handle);
$file_handle = $temp[0].$temp[1]; // 获取绝对地址
$temp = array(
"name" => $temp[1],
"locate" => $temp[0],
"type" => @filetype($file_handle),
"size" => filesize($file_handle),
"last_access" => fileatime($file_handle),
"last_modify" => filemtime($file_handle),
"last_change" => filectime($file_handle)
);
switch ($temp["type"]) {
case "file":
$temp["type"] = 1;
$result["count"]["files"]++;
$result["count"]["size"] += $temp["size"];
break;
case "dir":
$temp["type"] = 0;
$result["count"]["dirs"]++;
break;
default: // !!!! 鉴于 Win32 平台,对既非文件也非目录的内容忽略
$temp["type"] = -1;
}
$result["list"][] = $temp;
}
closedir($dir_handle);
unset($dir_handle, $file_handle, $temp);
clearstatcache(); // 清除文件系统缓存
return $this->result = $result;
}
function seek_file($pattern=".*",$dir_path=".",$seek_type=1,$sub_dir=0,$interal=false,$limit=100) {
/* Standardize all possible parameter values */
$pattern = "/".$pattern."/";
$seek_type = intval($seek_type);
$seek_type = $seek_type>0 ? 1 : ($seek_type<0 ? -1 : 0);
$sub_dir = abs(intval($sub_dir));
$internal = (bool)$interal;
$limit = abs(intval($ limit));
if ($limit==0) $limit = 100;
$sub_dir_list = array(array($dir_path)); // Treat the query directory as the first level of the subdirectory hierarchy
$result = array();
/* i The subdirectory level currently being processed, 0 is the specified directory level, that is, only one directory is processed */
for ($i=0;$i<= $sub_dir;$i++) {
if (!isset($sub_dir_list[$i])) return $this->result = $result; // If a certain level of subdirectory is not set, it means that the actual directory system If there is no more directory, return
/* k subdirectory statistics in each subdirectory level, j current processing sequence number */
for ($j=0,$k=count($sub_dir_list[$i]); $j<$k;$j++) { // Processed according to the number of subdirectories at each level
$l = $this->list_dir($sub_dir_list[$i][$j]);
if ( !$l) return $this->result = $result; // If an error occurs, stop returning the existing results immediately
$l = $l["list"];
/* n each child Statistics of files, directories, and other items in the directory, m is the current processing sequence number */
for ($m=0,$n=count($l);$m<$n;$m++) {
if (count($result)>=$limit) return $this->result = $result; // If the required number has been reached, return
if ($l[$m]["type"]== 0) $sub_dir_list[$i+1][] = $l[$m]["locate"].$l[$m]["name"]; // Collect the next level subdirectory information
$ o = $l[$m]["type"];
if ($o!=$seek_type&&($seek_type==1||$seek_type==0)) continue; // Ignore items that do not meet the requirements
elseif ($o==-1&&$seek_type==-1) continue;
if (!preg_match($pattern, $l[$m]["name"])) continue; // Ignore Items that match the regular expression
$result[] = $internal ? $l[$m] : array("name" => $l[$m]["name"], "locate" => $l[$m]["locate"], "type" => $l[$m]["type"]);
}
}
}
unset($i , $j, $k, $l, $m, $n, $o, $sub_dir_list);
return $this->result = $result;
}
function delete( $path="") {
if (!file_exists($path)) return $this->error_occur(0x0003, $path); // ----0x0003---- The specified object does not exist
if (is_dir($path)) {
$path = str_replace("", "/", realpath($path));
$path = substr($path, -1)=="/ " ? $path : $path."/";
$sub_list = array(array($path));
for ($i=0;$i
if (!isset($sub_list[$i])) break; // Explore to the end and get all the subtitles in the directory Directory list, convenient for deleting directories after deleting files
for ($j=0,$k=count($sub_list[$i]);$j<$k;$j++) {
$l = $this ->list_dir($sub_list[$i][$j]);
if (!$l) return $this->error_occur("", $sub_list[$i][$j]);
$l = $l["list"];
for ($m=0,$n=count($l);$m<$n;$m++) {
$o = $l [$m]["locate"].$l[$m]["name"];
if ($l[$m]["type"]==0) $sub_list[$i+1] [] = $o;
elseif (!@unlink($o)) return $this->error_occur(0x0004, $o); // Delete every file in the directory
}
}
}
for($i=count($sub_list)-1;$i>=0;$i--) // Reverse delete directory
for ($j=0,$k= count($sub_list[$i]);$j<$k;$j++) //Delete each subdirectory until the specified directory
if (!@rmdir($sub_list[$i][$j])) return $this->error_occur(0x0005, $sub_list[$i][$j]); // ----0x0005---- Directory does not have permission to delete
unset($i, $j, $k , $l, $m, $n, $o, $sub_list);
return true;
}elseif (@unlink($path)) return true;
else return $this->error_occur(0x0004, $path); // ----0x0004---- The file has no permission to delete
}
function generate_realpath($path="") {
if ($path==""||!is_string($path)) return $this->error_occur(0x0007, $path); / / ----0x0007---- Path parameter error
$path = preg_replace("/(?|]/", "", str_replace( "", "/", $path)); // Canonical symbols for multiple possibilities in paths
if (substr($path,1,1)==":") return $path; // !! !! Absolute path for Win32 platform
elseif (substr($path,0,1)=="/") return substr(realpath("."), 0, 2).$path; // !!! ! Absolute path conversion under Win32 platform
else {
if (substr($path,-1)=="/") $path = substr($path,0,-1); // Clear the end Possible / symbols
$path = preg_replace("//{2,}/", "/", $path); // Simplify /// similar connected symbols into one
$path = explode("/", $path); // Split path
$cur_path = explode("/", str_replace("", "/", realpath(".")));
for ($ i=0,$j=count($path);$i<$j;$i++) {
if ($path[$i]=="..") array_pop($cur_path);
elseif ($path[$i]=="."||$path[$i]==str_repeat(".", strlen($path[$i]))) continue; // Ignore useless relative path addresses . and .... etc.
else array_push($cur_path, $path[$i]);
}
$path = implode("/", $cur_path);
unset($ cur_path);
return $path;
}
}
function make_dir($path="") {
if (!$path=$this->generate_realpath( $path)) return false;
$path = explode("/", $path);
$i = array($path[0]);
for ($i=0,$j =count($path),$k=array(),$l="";$i<$j;$i++) {
array_push($k, $path[$i]);
$ l = implode("/", $k);
if (!file_exists($l)) {
if ($this->last_exist_dir=="") $this->last_exist_dir = $l ;
if (!@mkdir($l)) return $this->error_occur(0x0008, $l); // ----0x0008---- Unable to create directory
}
}
return true;
}
function verify_file($src="",$dst="",$internal=true) {
if (!file_exists($src)|| !is_file($src)) return $this->error_occur(0x000A, $src); // ----0x000A---- The specified object is not a file
if (!file_exists($dst)||! is_file($dst)) return $this->error_occur(0x000A, $dst);
$i = filesize($src);
if ($i!=filesize($dst)) {
unset($i);
return false;
}
if ($i>1024*1024*1024&&!$internal) { // For files larger than 1MB, if precise checking is not required, jump Pass
unset($i);
return true;
}
unset($i);
if (md5_file($src)!=md5_file($dst)) return false;
return true;
}
function copy($src_path="",$dst_path="") {
if (!file_exists($src_path)) return $this->error_occur(0x0003, $src_path);
if (!$dst_path=$this->generate_realpath($dst_path)) return false;
if (is_dir($src_path)) {
$this->last_exist_dir = ""; // 记录现行实际存在的目录
if (!$this->make_dir($dst_path)) return false; // 建立目录失败
$src_path = str_replace("", "/", realpath($src_path));
$src_path = substr($src_path, -1)=="/" ? $src_path : $src_path."/";
$sub_list = array(array($src_path));
for ($i=0;$iif (!isset($sub_list[$i])) break;
for ($j=0,$k=count($sub_list[$i]);$j<$k;$j++) {
$l = $this->list_dir($sub_list[$i][$j]);
if (!$l) return $this->error_occur(0x0003, $sub_list[$i][$j]);
$l = $l["list"];
for ($m=0,$n=count($l);$m<$n;$m++) {
$o = $l[$m]["locate"].$l[$m]["name"];
if ($o==$this->last_exist_dir) continue; // 如果为上级目录向下级目录复制,防止死循环
$p = str_replace(substr($src_path, 0, -1), $dst_path, $o);
if ($l[$m]["type"]==0) {
$sub_list[$i+1][] = $o;
if (!$this->make_dir($p)) return false; // 对每一个子目录都予以建立
} else { // 对每一个文件进行复制
if ($this->verify_file($o, $p)) continue; // 如果目标与源完全相同,不再复制
if (!copy($o,$p)||!$this->verify_file($o,$p)) return $this->error_occur(0x0009, $o); // ----0x0009---- 文件移动失败
}
}
}
}
unset($i, $j, $k, $l, $m, $n, $o, $p, $sub_list);
return true;
} else {
if (!is_readable($src_path)) return $this->error_occur(0x0006, $src_path); // ----0x0006---- 源文件无权读取
if ($this->verify_file($src_path,$dst_path)) return true;
$i = strrpos($dst_path, "/");
$dst_path = array(substr($dst_path, 0, $i), substr($dst_path, $i+1));
unset($i);
if (!$this->make_dir($dst_path[0])) return false;
$dst_path = implode("/", $dst_path);
if (!copy($src_path,$dst_path)||!$this->verify_file($src_path,$dst_path)) return $this->error_occur(0x0009, $src_path);
return true;
}
}
function move($src_path="",$dst_path="") {
if (!file_exists($src_path)) return $this->error_occur(0x0003, $src_path);
if (!$dst_path=$this->generate_realpath($dst_path)) return false;
if (is_dir($src_path)) {
$this->last_exist_dir = "";
if (!$this->make_dir($dst_path)) return false;
$src_path = str_replace("", "/", realpath($src_path));
$src_path = substr($src_path, -1)=="/" ? $src_path : $src_path."/";
$sub_list = array(array($src_path));
for ($i=0;$iif (!isset($sub_list[$i])) break;
for ($j=0,$k=count($sub_list[$i]);$j<$k;$j++) {
$l = $this->list_dir($sub_list[$i][$j]);
if (!$l) return $this->error_occur(0x0003, $sub_list[$i][$j]);
$l = $l["list"];
for ($m=0,$n=count($l);$m<$n;$m++) {
$o = $l[$m]["locate"].$l[$m]["name"];
if ($o==$this->last_exist_dir) continue;
$p = str_replace(substr($src_path, 0, -1), $dst_path, $o);
if ($l[$m]["type"]==0) {
$sub_list[$i+1][] = $o;
if (!$this->make_dir($p)) return false;
} else {
if ($this->verify_file($o, $p)) continue;
if (!copy($o,$p)||!$this->verify_file($o,$p)) return $this->error_occur(0x0009, $o);
if (!@unlink($o)) return $this->error_occur(0x0004, $o);
}
}
}
}
for($i=count($sub_list)-1;$i>=0;$i--)
for ($j=0,$k=count($sub_list[$i]);$j<$k;$j++)
if (strpos($this->last_exist_dir,$sub_list[$i][$j])!==false) continue; // 对移动目标目录的上层目录,不予考虑删除
elseif (!@rmdir($sub_list[$i][$j])) return $this->error_occur(0x0005, $sub_list[$i][$j]);
unset($i, $j, $k, $l, $m, $n, $o, $p, $sub_list);
return true;
} else {
if (!is_readable($src_path)) return $this->error_occur(0x0006, $src_path);
if ($this->verify_file($src_path,$dst_path)) return true;
$i = strrpos($dst_path, "/");
$dst_path = array(substr($dst_path, 0, $i), substr($dst_path, $i+1));
unset($i);
if (!$this->make_dir($dst_path[0])) return false;
$dst_path = implode("/", $dst_path);
if (!copy($src_path,$dst_path)||!$this->verify_file($src_path,$dst_path)) return $this->error_occur(0x0009, $src_path);
if (@unlink($src_path)) return true;
else return $this->error_occur(0x0004, $src_path);
}
}
}
?>