Home > Backend Development > PHP Tutorial > Jiageng College Teaching File System Basic File System Operation Class

Jiageng College Teaching File System Basic File System Operation Class

WBOY
Release: 2016-07-29 08:35:12
Original
3898 people have browsed it

Copy the code The code is as follows:


error_reporting(2047);
/*
* Class IO (SNakeVil Completed 03.25.04) (v1.0.0.0)
*
* [Description]
* This class is used for file system deal with.
*
* [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 and directories in the corresponding directory and subdirectories at a given level based on regular expression conditions.
* $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 includes both
* $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, the detailed information of the search results will be returned, otherwise only the file name, type and directory will be returned
* $limit Numeric value, search result limit, to avoid excessive waste of system resources
* If there is an error, return FALSE, otherwise return
* array(
* array(
* "name","locate","type"
* [, "size","last_access","last_change","last_modify"]
* ),
* ......
* )
* ********
* ******* *
* **** delete($path);
* Delete the specified object, file or folder - including non-empty folders containing subdirectories and files.
* $path string, specifies the content path to be deleted, either a file or directory
* If there is an error and interrupts 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 the server burden
* If available Returns FALSE on error, otherwise returns TRUE
* ********
* ********
* **** copy($src_path, $dst_path);
* for any folder or file Copying can be done with a relative or absolute path. After the file is copied, 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, which can be 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, which can be $ src_path lower directory
* Returns FALSE if there is an error, otherwise returns 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 path of the source content to be moved, either a file or directory
* $dst_path String, specifies the path of the target content to be moved, either a file or directory, the nature is determined by $src_path, which can be $ src_path lower directory
* Returns FALSE if there is an error, otherwise returns TRUE
*
* [Copyright]
* Fengyu Mingqing (SNakeVil@51js, SNakeVil@BU) independently designed and completed, 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,$internal=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)$internal;
$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 currently processed subdirectory level, 0 is the specified directory layer, that is, only processing one directory */
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 there is no directory in the actual directory system, 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++) { // Process 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 Statistics of files, directories, and other items in each subdirectory, 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 do not 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;$ iif (!isset($sub_list[$i])) break; // Explore Go to the end and get a list of all subdirectories in the directory to facilitate deleting the directory 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 deletion of 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---- The directory has no 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)); / / Standardize multiple possible symbols in the path
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 possible trailing / symbols
$path = preg_replace("//{2,}/", " /", $path); // Simplify /// similar connected symbols into one
$path = explode("/", $path); // Split the 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 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&&!$interal) { // For files larger than 1MB, if precise checking is not required, Skip
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); 



?>

以上就介绍了嘉庚学院教学文件系统 文件系统基本操作类,包括了嘉庚学院教学文件系统方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template