Copy CodeThe code is as follows:
Error_reporting (2047);
/*
* Class IO (Snakevil completed 03.25.04) (v1.0.0.0)
*
* [Description]
* This class is used for processing the file system.
*
* [function]
* * * * * LIST_DIR ($dir _path);
* Reads the contents of the specified directory and returns an array of contents.
* $dir _path string, specifying directory path
* Returns False if error is returned.
* 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, $interal, $limit);
* Search for matching files and directories in the corresponding directories and subdirectories of a given level according to the regular expression conditions.
* $pattern Regular expressions that comply with PERL compliant standards, without adding//and adding the system yourself
* $seek _type have-1 0 13 possible values, 0 folders only, 1 files only, 12 are included
* $sub _dir numeric value, search subdirectory depth, specified directory does not count, recommended not more than 5
* $interal Boolean, returns the details of the search results, or returns only the file name, type, and directory in which it was found
* $limit numeric value, limit search results, avoid excessive waste of system resources
* Returns False if error is returned.
* 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 specifying the content path to be deleted, the file or directory can be
* If error is interrupted at error, return FALSE, otherwise true
* ********
* ********
* * * * * MAKE_DIR ($path);
* Create any folder, relative or absolute path can be, deep build can also.
* $path string, the final directory path to be established
* Returns TRUE if error returns false
* ********
* ********
* * * * * * Verify_file ($SRC, $DST, $interal);
* Compare two files using the MD5 algorithm.
* $SRC string, source file path
* $DST string, destination file path
* $interal boolean value, for files larger than 1M, can be set to FALSE to eliminate MD5 inspection steps and reduce server burden
* Returns TRUE if an error returns false
* ********
* ********
* * * * Copy ($src _path, $dst _path);
* To copy any folder, file, relative or absolute path can be, the file copy is done after the validation, check whether error data error.
* $SRC _path string specifying the source content path to be copied, the file or directory can be
* $DST _path String, specifies the destination content path to be copied, the file or directory can be, the nature is determined by the $SRC _path, can be $src _path lower directory
* Returns TRUE if an error returns false
* ********
* ********
* * * * * Move ($src _path, $dst _path);
* For any folder, file to move, relative or absolute path can be, the file movement is done after the validation, check whether error data errors.
* $SRC _path string specifying the source content path to be moved, the file or directory can be
* $DST _path String, specify the destination content path to move, file or directory can be, nature determined by $src _path, can be $src _path lower directory
* Returns TRUE if an error returns false
*
* [Copyright]
* Wind and rain Ming and Qing dynasties (SNAKEVIL@51JS, SNAKEVIL@BU) Independent design completed, All rights reserved.
* Free to use, but do not keep the following text, 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----An error occurred, but the cause of the error is unknown
if (Is_int ($error _id)) $this->error_id = $error _id; Get error number
$this->error_related = $error _related;
return false; False when error occurs to facilitate further processing
}
function List_dir ($dir _path= ".") {
if (!is_dir ($dir _path)) return $this->error_occur (0x0001, $dir _path); ----0X0001----The specified directory does not exist
if (! $dir _handle= @opendir ($dir _path)) return $this->error_occur (0x0002, $dir _path); ----0X0002----The specified directory does not have permission to read
$result = Array (
"Count" = = Array ("Files" = 0, "dirs" = 0, "size" = 0),
"List" = = Array ()
);
while (false!== ($file _handle=readdir ($dir _handle)) {//Use!== to prevent processing of files, directories with name 0 or false
if ($file _handle== "." | | $file _handle== "..") Continue Ignore system-specific two folders
$temp = Str_replace ("\", "/", Realpath ($dir _path));
$temp = substr ($temp,-1) = = "/"? $temp: $temp. " /";
$temp = Array ($temp, $file _handle);
$file _handle = $temp [0]. $temp [1]; Get absolute Address
$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://!!!! Given the Win32 platform, ignoring content that is neither a file nor a directory
$temp ["type"] =-1;
}
$result ["list"] = $temp;
}
Closedir ($dir _handle);
Unset ($dir _handle, $file _handle, $temp);
Clearstatcache (); Clearing the file system cache
return $this->result = $result;
}
function Seek_file ($pattern = ". *", $dir _path= ".", $seek _type=1, $sub _dir=0, $interal =false, $limit =100) {
/* Specification of 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));
$interal = (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 layer of the subdirectory hierarchy
$result = Array ();
/* I currently process the subdirectory hierarchy, 0 for the specified directory layer, that is, to process only one directory */
for ($i =0; $i <= $sub _dir; $i + +) {
if (!isset ($sub _dir_list[$i])) return $this->result = $result; If a level subdirectory is not set, there is no directory in the actual directory system and returns
/* k per subdirectory hierarchy of sub-directory statistics, j current processing sequence number */
For ($j =0, $k =count ($sub _dir_list[$i]), $j < $k, $j + +) {//per-layer sub-directory quantity processing
$l = $this->list_dir ($sub _dir_list[$i] [$j]);
if (! $l) return $this->result = $result; An error occurs and immediately stops returning the existing results
$l = $l ["List"];
/* n each subdirectory in the file, directory, other item statistics, M is the current processing ordinal */
For ($m =0, $n =count ($l), $m < $n; $m + +) {
if (count ($result) >= $limit) return $this->result = $result; If the requested 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 of 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 conform to regular expressions
$result [] = $interal? $l [$m]: Array ("name" + $l [$m] ["name"], "locate" and "[$l] [" Locate "]," type "and" [$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----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 very end, get a list of all subdirectories in this directory, easy to delete after file delete directory
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 a directory
}
}
}
For ($i =count ($sub _list)-1; $i >=0; $i-)//Reverse Back 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----file does not have 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)); Symbol of multiple probabilities in canonical path
if ($path, substr) = = ":") return $path; // !!!! Absolute path to the Win32 platform
ElseIf (substr ($path, 0,1) = = "/") return substr (Realpath ("."), 0, 2). $path; // !!!! Absolute path conversion under the Win32 platform
else {
if (substr ($path, -1) = = "/") $path = substr ($path, 0,-1); Clear the end of possible/symbol
$path = Preg_replace ("//{2,}/", "/", $path); simplifies///such as a similar linked symbol to a
$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; Ignores the useless relative path address. And.... such as
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----Cannot create a directory
}
}
return true;
}
function Verify_file ($src = "", $dst = "", $interal =true) {
if (!file_exists ($SRC) | |! Is_file ($SRC)) return $this->error_occur (0x000A, $SRC); ----0x000A----Specified object non-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 greater than 1MB, if the exact check 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 = ""; Record the actual existing directory
if (! $this->make_dir ($dst _path)) return false; Failed to build directory
$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; $i if (!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; Prevent a dead loop if the parent directory is replicated to the subordinate directory
$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; Built for each subdirectory
} else {//copy each file
if ($this->verify_file ($o, $p)) continue; If the target is exactly the same as the source, no longer replicates
if (!copy ($o, $p) | |! $this->verify_file ($o, $p)) return $this->error_occur (0x0009, $o); ----0x0009----File move failed
}
}
}
}
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----Source file does not have permission to read
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; $i if (!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; Do not consider deleting the upper directory of the Moving target directory
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);
}
}
}
?>
http://www.bkjia.com/PHPjc/317078.html www.bkjia.com true http://www.bkjia.com/PHPjc/317078.html techarticle Copy the code as follows: PHP error_reporting (2047);/* *classio (Snakevil complete 03.25.04) (v1.0.0.0) * *[Description] * This class is used for processing the file system. * *[function] *****list_dir (...