error_reporting(2047);
/*
* Class IO (SNakeVil Completed 03.25.04) (v1.0.0.0)
*
* [説明]
* このクラスはファイルシステムに使用されます処理。
*
* [関数]
* **** list_dir($dir_path);
* 指定されたディレクトリの内容を読み取り、その内容の配列を返します。
* $dir_path 文字列、ディレクトリパスを指定します
* エラーがある場合は FALSE を返し、そうでない場合は返します
* 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) ;
* 正規表現条件に基づいて、指定されたレベルの対応するディレクトリおよびサブディレクトリ内で一致するファイルとディレクトリを検索します。
* $pattern は PERL 互換性標準に準拠した正規表現です。// を追加する必要はありません。システムが自動的に追加します
* $seek_type には 3 つの可能な値があります -1 0 1、0 はフォルダーのみ、1 はファイルのみ, -1 には両方が含まれます
* $sub_dir 数値、検索されるサブディレクトリの深さ、指定されたディレクトリはカウントされません、5 を超えないようにすることをお勧めします
* $internal ブール値、true の場合、検索結果の詳細情報それ以外の場合は、ファイル名、タイプ、ディレクトリのみが返されます
* $limit システム リソースの過剰な浪費を避けるための数値、検索結果の制限
* エラーがある場合は FALSE を返し、それ以外の場合は
* 配列を返します(
* array(
* "name","locate","type"
* [, "size","last_access","last_change","last_modify"]
* ),
* ......
* )
* ********
* ******* *
* **** delete($path)
* 指定されたオブジェクト、ファイル、またはフォルダーを削除します (空でないものも含む)。サブディレクトリとファイルを含むフォルダー。
* $path 文字列、削除するコンテンツ パス (ファイルまたはディレクトリ) を指定します
* エラーがあり、エラーで中断された場合は FALSE を返し、それ以外の場合は TRUE を返します
* ********
* *** *****
* **** make_dir($path);
* 相対パスまたは絶対パス、または詳細な作成で任意のフォルダーを作成します。
* $path 文字列、作成される最終ディレクトリ パス
* エラーがある場合は FALSE を返し、それ以外の場合は TRUE を返します
* ********
* ********
* ** ** verify_file($src, $dst, $internal);
* MD5 アルゴリズムを使用して、2 つのファイルが同じかどうかを比較します。
* $src 文字列、ソース ファイル パス
* $dst 文字列、ターゲット ファイル パス
* $internal ブール値、1M を超えるファイルの場合、MD5 検証手順を保存し、サーバーの負担を軽減するために FALSE に設定できます。
* 利用可能な場合はエラー時に FALSE を返し、それ以外の場合は TRUE を返します
* ********
* ********
* **** copy($src_path, $dst_path);任意のフォルダーまたはファイル 相対パスまたは絶対パスを使用してコピーを実行できます。ファイルがコピーされた後、エラーやデータ エラーがないかどうかが確認されます。
* $src_path 文字列、コピーするソース コンテンツ パス (ファイルまたはディレクトリ) を指定します。
* $dst_path 文字列、コピーするターゲット コンテンツ パス (ファイルまたはディレクトリ) を指定します。性質は $src_path によって決まります。 $ src_path の下位ディレクトリにすることができます
* エラーがある場合は FALSE を返し、そうでない場合は TRUE を返します
* ********
* ********
* **** move($ src_path, $dst_path);
* 相対パスまたは絶対パスでフォルダーまたはファイルを移動します。ファイルの移動が完了すると、エラーやデータ エラーがないかどうかが確認されます。
* $src_path 文字列、移動するソース コンテンツのパス (ファイルまたはディレクトリ) を指定します。
* $dst_path 文字列、移動するターゲット コンテンツのパス (ファイルまたはディレクトリ) を指定します。性質は次によって決まります。 $src_path、$ src_path の下位ディレクトリにすることができます
* エラーがある場合は FALSE を返し、それ以外の場合は TRUE を返します
*
* [著作権]
* Fengyu Mingqing (SNakeVil@51js、SNakeVil@BU) が独自に設計し完成させたもの、すべての権利予約済み。
* ご自由にお使いください。ただし、以下のテキストは保存しないでください。よろしくお願いします。
*
* ===========Z=================
* Class.IO.v1.0.0.0.build040325
* 用。 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_関連;
var $last_exist_dir;
function IO() {
$this->result = array();
$this->error_id = 0x0000;
$this->エラー関連 = "";
$this->last_exist_dir = "";
$this を返す; : ;error_id = $error_id; // 获取错误号
$this->error_popular = $error_popular;
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 =="..") 続行します。 // 忽略系特定の 2 つの文件夹
$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" => filemtime($file_handle),
"last_change" =>ファイルハンドル)
);
switch ($temp["type"]) {
case "file":
$temp["type"] = 1;
$result["カウント"]["ファイル"]++;
$result["count"]["size"] += $temp["size"];
休憩;
case "dir":
$temp["type"] = 0;
$result["count"]["dirs"]++;
休憩;
デフォルト: // !!!! Win32 平台に属し、非文件も非目录の内容忽略
$temp["type"] = -1;
}
$result["list"][] = $temp;
}
closedir($dir_handle);
unset($dir_handle, $file_handle, $temp);
clearstatcache(); // 清除文件系统缓存
return $this->result = $result;
}
function look_file($pattern=".*",$dir_path=".",$seek_type=1,$sub_dir=0,$internal=false,$limit=100) {
/* 可能なすべてのパラメータ値を標準化します * /
$pattern = "/".$pattern."/";
$seek_type = intval($seek_type) 1 : ($seek_type$internal = (bool)$internal;
if ($limit==0) $limit = 100; $sub_dir_list = array(array($dir_path)); // クエリ ディレクトリをサブディレクトリ階層の最初のレベルとして扱います
$result = array()
/* i 現在処理されているサブディレクトリ レベル、0 が指定されています。つまり、1 つのディレクトリのみが処理されます */
for ($i=0;$i<=$sub_dir;$i++) {
if (!isset($sub_dir_list[$i])) return $this->result = $result; // 特定のレベルのサブディレクトリが設定されていない場合は、実際のディレクトリ システムにディレクトリが存在しないことを意味し、各サブディレクトリ レベルの k 個のサブディレクトリ統計、j の現在の処理シーケンス番号 */
for ($j =0,$k=count($sub_dir_list[$i]);$j$l = $this-> list_dir($sub_dir_list[ $i][$j]);
if (!$l) return $this->result = $result; // エラーが発生した場合は、既存の結果を返すのを直ちに停止します
$l = $ l["list"] ;
/* n 各サブディレクトリ内のファイル、ディレクトリ、およびその他の項目の統計。m は現在の処理シーケンス番号 */
for ($m=0,$n=count($l); $m<$n;$m++ ) {
if (count($result)>=$limit) return $this->result = $result; // 必要な数に達した場合は、 return
if ($ l[$m]["タイプ"] ==0) $sub_dir_list[$i+1][] = $l[$m]["場所"].$l[$m]["名前"] / / 次のレベルのサブディレクトリ情報を収集します
$ o = $l[$m]["type"];
if ($o!=$seek_type&&($seek_type==1||$seek_type==0)) / / 要件を満たさない項目を無視します
elseif ($o==-1&&$seek_type==-1) continue
if (!preg_match($pattern, $l[$m]["name"])) continue; ; // 正規表現に一致しない項目を無視します
$result[] = $internal ? $l[$m] : array("name" => $l[$m]["name"], "locate " => $l[$m][" 検索"], "タイプ" => $l[$m]["タイプ"]);
}
}
}
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---- 指定されたオブジェクトは存在しません
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; / / ファイルを削除した後にディレクトリを削除できるように、最後まで探索してディレクトリ内のすべてのサブディレクトリのリストを取得します
for ($j= 0,$k=count($sub_list[$i]);$j$l = $this->list_dir($sub_list[$i][$j]); (!$l) return $this->error_occur("", $sub_list[$i][ $j]);
$l = $l["list"]; =count($l);$m$o = $l [$m]["場所"].$l[$m]["名前"];
if ($l) [$m]["type"]==0) $sub_list[$i+1][] = $o;
elseif (!@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]);$jif (!@rmdir($sub_list[$i][ $j])) return $this->error_occur(0x0005, $sub_list[$i] [$j]) // ----0x0005---- ディレクトリには
unset($i) を削除する権限がありません、$j、$k、$l、$m、$n、$o、$sub_list);
true を返します
}elseif (@unlink($path)) return true;
else return $this->error_occur(0x0004, $path) // ----0x0004---- ファイルには削除する権限がありません
}
function generated_realpath( $path="") {
if ($path==""||!is_string($path)) return $this->error_occur(0x0007, $path); // ----0x0007- --- パス パラメーター エラー
$path = preg_replace("/(?|]/", "", str_replace("", "/", $path )); // 仕様パス内の複数のシンボルの可能性
if (substr($path,1,1)==":") return $path !!!! Win32 プラットフォームの絶対パス
elseif; $path ,0,1)=="/") return substr(realpath("."), 0, 2).$path !!!! Win32 プラットフォームでの絶対パス変換
else {
if (substr; ( $path,-1)=="/") $path = substr($path,0,-1); // 末尾の / 記号を消去します
$path = preg_replace("//{2,}/", "/", $path); // 類似した接続されたシンボルを 1 つに単純化します
$path =explode("/", $path); // パスを分割します
$cur_path =explode("/", str_replace(" ", "/", realpath(".")));
for ($i=0,$j=count($path);$iif ($path [$i ]=="..") array_pop($cur_path);
elseif ($path[$i]=="."||$path[$i]==str_repeat(".", strlen($ path[$ i]))) continue; // 無駄な相対パス アドレスを無視します。
else array_push($cur_path, $path[$i]);
$path = implode("/ ", $ cur_path);
unset($cur_path);
return $path;
}
}
if (!$path=$this->generate_realpath($path )) false;
$path =explode("/", $path);
$i = array($path[0]); (),$l="";$iarray_push($k, $path[$i]);
$l = implode("/", $k); !file_exists($l)) {
if ($this->last_exist_dir=="") $this->last_exist_dir = $l;
if (!@mkdir($l)) return $this->error_occur (0x0008, $l); // ----0x0008---- ディレクトリを作成できません
}
}
return true
}
function verify_file($src="",$dst="" ,$) Internal=true) {
if (!file_exists($src)||!is_file($src)) return $this->error_occur(0x000A, $src); // ----0x000A---- 指定されたオブジェクトはファイルではありません
if (!file_exists($dst)||!is_file($dst)) return $this->error_occur(0x000A, $dst);
$i = filesize($src); $ i!=filesize($dst)) {
unset($i);
return false;
if ($i>1024*1024*1024&&!$internal) { // 1MB を超えるファイルの場合必須の正確なチェック、
return true
}
if (md5_file($src)!=md5_file($dst)) 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)) 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["リスト"];
for ($m=0,$n=count($l);$m$o = $l[$m]["検索"].$l[$m][ "名前"];
if ($o==$this->last_exist_dir) 続行; // 結果が上级目录方向下级目录复制、死循環防止
$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, $サブリスト);
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));
設定を解除($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);
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)) 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["リスト"];
for ($m=0,$n=count($l);$m$o = $l[$m]["検索"].$l[$m][ "名前"];
if ($o==$this->last_exist_dir) 続行;
$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)) 続行;
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]);$jif (strpos($this->last_exist_dir,$sub_list[$i][$j])!==false) 続行; // 对移動目标目录の上層目录,不予虑删除
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);
true を返します。
} else {
if (!is_readable($src_path)) return $this->error_occur(0x0006, $src_path);
if ($this->verify_file($src_path,$dst_path)) true を返します。
$i = strrpos($dst_path, "/");
$dst_path = array(substr($dst_path, 0, $i), substr($dst_path, $i+1));
設定を解除($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)) true を返します。
else return $this->error_occur(0x0004, $src_path);
}
}
}
?>