<?php
//============================================================
//------------------删除文件夹中所有的文件-------------------
/**
* 删除文件夹中所有的文件,不包括文件夹
* 
* @param $path 路径 如./path/dir/
*/
function delete_all_files_in_the_directory($path){
	$dir = opendir($path);
	while($file = readdir($dir)){
		$full_path = $path.'/'.$file;
		if($file != '.' and $file != '..'){
			if(is_file($full_path)){
				unlink($full_path);
			}else{
				delete_all_files_in_the_directory($full_path);
			}
		}
	}
	closedir($dir);
}
//====================文件类型与属性信息======================
//------------------------------------------------------------
filetype		//返回文件或目录的字符串类型

filetype("Hello.txt");
filetype("Hello");
//判断文件类型
if(filetype=="dir"){
	echo "This is dir";
}else{
	echo "This is file";
}
//判断文件
is_file				//判断文件是否正常的文件
is_dir* 				//判断给定文件名是否是一个目录
is_readable			//判断文件是否可读
is_link				//判断给定文件名是否为一个符号连接
is_writable			//判断给定的文件名是否可写
is_executable* 		//判断给定文件名是否可执行
is_link 				//判断给定文件名是否为一个符号连接
is_writable* 			//判断给定的文件名是否可写
is_writeable 			//is_writable()的别名
is_readable* 		//判断给定文件名是否可读
is_uploaded_file* 	//判断文件是否是通过 HTTP POST 上传的
//---------------------------------------------------------
//-------------------判断文件类型与大小-------------------
function GetFilePro($FileName){
	if(!file_exists($FileName)){
		echo "File or dir ".$FileName."is not exists<br>";
		return;
	}else{
		echo "Filetype is ".filetype($FileName)."<br>";
	}
	if(is_file($FileName)){
		echo "This is file<br>";
		echo "File size is ".filesize($FileName)."<br>";
	}
	if(is_dir($FileName)){
		echo "This is dir<br>";
	}
	if(is_readable($FileName)){
		echo "This file can read<br>";
	}
	if(is_writable($FileName)){
		echo "This file can write<br>";
	}
	if(is_executable($FileName)){
		echo "This file can execute<br>";
	}
	//输出文件的创建,修改,访问时间
	echo "File creation date is ".date('Y-m-d H:i:s',filectime($FileName)) ."<br>";
	echo "File modification time is ".date('Y-m-d H:i:s',filemtime($FileName)) ."<br>";
	echo "File access time is ".date('Y-m-d H:i:s',fileatime($FileName))."<br>";
}
GetFilePro("hello.html");

//---------------------------------------------------------
//----------------------时区设置---------------------------
date_default_timezone_set('PRC');	//将时区设置成中华人民共和国

//---------------------------------------------------------
//-------------------文件大小单位判断---------------------
/**
* 返回人性化显示文件大小名称
* @param $FileSize int 文件大小
* @return String 加单位名称文件大小
*/
function GetFileSize($FileSize){//参数:文件大小
	$Unit="Byte";
	
	if($FileSize>=pow(2,40)){
		//文件大小除以二的四十次方并保留两位小数
		$FileSize=round($FileSize/pow(2,40),2);
		$Unit="TB";
	}else if($FileSize>=pow(2,30)){
		$FileSize=round($FileSize/pow(2,30),2);
		$Unit="GB";
	}else if($FileSize>=pow(2,20)){
		$FileSize=round($FileSize/pow(2,20),2);
		$Unit="MB";
	}else if($FileSize>=pow(2,10)){
		$FileSize=round($FileSize/pow(2,10),2);
		$Unit="KB";
	}else{
		$Unit="Byte";
	}
	return $FileSize.$Unit;
}
//---------------------------------------------------------
//-------------------stat()取得文件信息-------------------
//取得文件信息
echo "<pre>";
print_r(stat('hello.html'));
echo "</pre>";
/*	Array
(
	[0] => 2
	[1] => 0
	[2] => 33206
	[3] => 1
	[4] => 0
	[5] => 0
	[6] => 2
	[7] => 341
	[8] => 1384532912
	[9] => 1384532912
	[10] => 1384532085
	[11] => -1
	[12] => -1
	[dev] => 2
	[ino] => 0
	[mode] => 33206
	[nlink] => 1
	[uid] => 0
	[gid] => 0
	[rdev] => 2
	[size] => 341
	[atime] => 1384532912
	[mtime] => 1384532912
	[ctime] => 1384532085
	[blksize] => -1
	[blocks] => -1
)*/

//---------------------------------------------------------
//---------------------文件缓存实例-----------------------
$CacheTime=5;	//缓存时间
$CacheFile="hello.txt";

if(file_exists($CacheFile) && (time()-$CacheTime) < filemtime($CacheFile)){
	echo file_get_contents($CacheFile);	//如果缓存在缓存时间类就读出缓存数据
}else{
	file_put_contents($CacheFile,date('Y-m-d H:i:s',time()));
}

//=============================================================
//-------------------文件路径及操作权限-----------------------
.	//当前目录
..	//上一级目录
basename($url)		//取路径的文件名
dirname($url)		//取路径的路径部分

//---------------------------------------------------------
//-----------------pathinfo()取出路径信息-----------------
$URL="C:/lamp/apache2/htdocs/hello.html";
echo "<pre>";
print_r(pathinfo($URL));
echo "</pre>";
/*Array
(
	[dirname] => C:/lamp/apache2/htdocs
	[basename] => hello.html
	[extension] => html
	[filename] => hello
)*/
//---------------------------------------------------------
//--------------------文件的操作--------------------------
//删除文件
unlink("./Hello.php");
//拷贝文件
copy("./Test/Old.php","./New.php");
//创建文件
touch("./Hello.php")
//移动文件
rename("./Old.php","./Hello/New.php",[$Content]);

//---------------------------------------------------------
//---------------------文件权限----------------------------
7 7 7	4+2+1	4+2+1	4+2+1
		r  w  x	r  w  x	r  w  x

//改变文件模式
chmod("./Hello.php",0755);
//改变文件的所有者
chown("admin","./Hello.php");
//改变文件所属的组
chgrp("./Hello.php","admin");

filegroup 		//取得文件的组
fileowner 		//取得文件的所有者

//=============================================================
//---------------------文件的读写与操作-----------------------
//--------------------读取函数-----------------------------
//1.把整个文件读入一个字符串中
file_get_contents();
//2.把整个文件读入一个数组中,一行就是一个数组元素
file();
//3.读取文件若成功,则返回从文件中读入的字节数
readfile();
//4.
fopen();
	fread();		//读取指定长度
	fgetc();		//读取单个字符
	fgets();		//读取一行字符
		feof();		//读取文件出错或结尾返回真
fclose();		//关闭fopen打开的文件
//---------------------------------------------------------
//---------------------写入函数----------------------------
//1.
$File = fopen("./Test.txt");
	fwrite($File,"Hello\n");
//2.
file_put_contents("Test.txt","Hello",FILE_APPEND);
	FILE_APPEND//追加法术
//---------------------------------------------------------
//------------------------例-------------------------------
//1.读取文件(覆盖重写)
$str = file_get_contents("Test.txt");
echo $str;

//2.读取一个文件并输出,不用echo
readfile("./Hello.php");

//3.将文件中的每一行作为数组的一个元素
$Arr=file("./Test.txt");
echo "<pre>";
print_r($Arr);
echo "</pre>";
/*Array
(
[0] => Hello
[1] => How are you
[2] => I am fine
[3] => Thank you
[4] => And You
)*/
//统计行数
echo count($Arr);
//4.
//---------------------------------------------------------
//-----------------------fread()---------------------------
//读取本地文件
$File=fopen("./Test.txt","r");
echo fread($File,filesize("./Test.txt"));
fclose($File);

//读取远程文件
$File=fopen("http://www.baidu.com","r");
$str="";
while(!feof($File)){
	$str.=fread($File,100);
}
echo $str;		//输出字符串
fclose($File);
//---------------------------------------------------------
//------------------------fgets()--------------------------
//每次读取一行
$File=fopen("./Test.txt","r");
$str="";
$i=0;
while(!feof($File)){
	$str.=fgets($File);
	$i++;
}
echo $i;	//输出行数
fclose($File);
//---------------------------------------------------------
//------------------------fgetc()--------------------------
//每次读取单个字符
$File=fopen("./Test.txt","r");
$str="";
$i=0;
while(!feof($File)){
	$str.=fgetc($File);
	$i++;
}
echo $i;	//输出字符数
fclose($File);
//---------------------------------------------------------
//------------------------fopen()--------------------------
//"+"表示读写
r		//只读
r+
w		//只写,创建,重写
w+
a		//只写,创建,追加
a+
b		//二进制打开 (rb 读二进制 wb 写二进制)
t		//文本模式打开

//fopen返回文件资源
$File=fopen("./Test.txt","w");
for($i=0;$i < 10;$i++){
	fwrite($File,"Hello\n");
}
fclose($File);
//========================文件指针============================
//------------------------------------------------------------
ftell($file);					//返回指针位置
fseek($file,10);			//指定指针位置
			fseek($file,10,SEEK_SET);		//开始位置后十个(默认)
			fseek($file,10,SEEK_CUR);		//当前位置后十个
			fseek($file,-10,SEEK_END);		//结尾位置前十个
fread();					//读多少指针移动多少
rewind();					//回到文件头部
//---------------------------------------------------------
//----------------------ftell()----------------------------
$file=fopen("./Test.txt","r");
echo ftell($file)."<br>";	//输出指针位置
echo fread($file,10)."<br>";
echo ftell($file)."<br>";
fclose($file);
//---------------------------------------------------------
//-----------------------fseek()---------------------------
$file=fopen("./Test.txt","r");
echo fread($file,6);
fseek($file,2);		//将文件指针移到文件开头后两个
echo fread($file,6);
fclose($file);
//---------------------------------------------------------
//------------------------rewind()-------------------------
$file=fopen("./Test.txt","r");
echo ftell($file);
echo fread($file,6);
rewind($file);		//将指针移到开头
echo ftell($file);
fclose($file);
//===========================文件锁============================
//------------------------------------------------------------
flock($file,LOCK_SH);			//读文件锁
flock($file,LOCK_EX);			//写文件锁
flock($file,LOCK_UN);			//释放锁
//---------------------------------------------------------
//------------------------flock()--------------------------
//读文件加锁
if(flock($file,LOCK_SH)){		//加读文件锁
	$str=fread($file,filesize($fileName));
	flock($file,LOCK_UN);		//开锁
}
//写文件加锁
if(flock($file,LOCK_EX)){		//加写文件锁
	fwrite($file,$contents);
	flock($file,LOCK_UN);		//开锁
}
//============================================================
//------------------------目录的操作-------------------------
//目录遍历
opendir			//打开目录
readdir			//遍历目录
closedir			//关闭目录
rewinddir		//目录指针倒回

scandir			//列出指定路径中的文件和目录
getcwd			//取得当前工作目录

chdir			//改变目录
chroot			//改变根目录

//---------------------------------------------------------
//--------------------目录与文件遍历----------------------
//打开目录
$dir = opendir("./");
//循环目录
while ($fileName = readdir($dir)){
	echo "filename: ".$fileName."<br/>";	//输出目录与文件
}
//关闭目录
closedir($dir);
//---------------------------------------------------------
//------------------判断是文件还是目录--------------------
$dirName="hello";
$dir = opendir($dirName);
while ($fileName = readdir($dir)){
	$subDirName=$dirName."./".$fileName;		//$file当前目录下的文件
	if(is_dir($subDirName)){
		echo "dirname: ".$fileName."<br>";
	}else{
		echo "filename: ".$fileName."<br>";
	}
}
closedir($dir);
//---------------------------------------------------------
//-------------------统计目录大小-------------------------
/**
* 统计目录大小
* @param $dirName String 目录所在路径
* @return String 返回一个目录的大小
*/
function dirSize($dirName){
	$dirSize=0;
	//打开目录
	$dir=opendir($dirName);
	//遍历目录
	while($fileName = readdir($dir)){
		$subDirName=$dirName.'/'.$fileName;
		if($fileName!="." && $fileName!=".."){
			if(is_dir($subDirName)){
				$dirSize+=dirSize($subDirName);//如果是文件夹则递归调用自己
			}else{
				$dirSize+=filesize($subDirName);//累加文件大小
			}
		}
	}
	closedir($dir);//关闭目录
	return $dirSize;
}
//函数调用
echo dirSize("www");
//---------------------------------------------------------
//------------------------mkdir()--------------------------
//创建目录
mkdir("dirName","755");
//---------------------------------------------------------
//------------------------删除目录------------------------
/**
* 删除目录
* @param $dirName 目录所在路径
* @return boolean 删除是否成功
*/
function delDir($dirName){
	//判断是否存在
	if(file_exists($dirName)){
		$dir=opendir($dirName);
		//遍历目录
		while($fileName=readdir($dir)){
			if($fileName!="." && $fileName!=".."){
				$subDirName=$dirName."/".$fileName;
				if(is_dir($subDirName)){
					delDir($subDirName);//递归
				}else{
					unlink($subDirName);//删除文件
				}
			}
		}
		closedir($dir);//关闭目录
		$rmdir=rmdir($dirName);
	}
	return $rmdir;
}
//调用
delDir("hello");
//---------------------------------------------------------
//------------------------移动函数-------------------------
rename("hello","hello/Test");
//------------------------------------------------------------
//-----------------------复制目录函数------------------------
//参数:源目录,目标目录
/**
* 复制目录函数
* @param $dirSource 要拷贝的目录
* @param $dirDestination 将文件要拷贝到的目录
*/
function copyDir($dirSource,$dirDestination){
	//目标是文件则停止复制
	if(is_file($dirDestination)){
		echo "It is not Directory";
		return ;
	}
	//目标文件不存在则复制文件
	if(!file_exists($dirDestination)){
		mkdir($dirDestination);
	}
	//打开文件夹
	$dir=opendir($dirSource);
	//循环操作目录文件
	while($fileName=readdir($dir)){
		if($fileName!="." && $fileName!=".."){
			//源文件夹的子文件夹
			$subDirNameSource=$dirSource."/".$fileName;
			//目标文件夹的子文件夹
			$subDirNameDestination=$dirDestination."/".$fileName;
			if(is_dir($subDirNameSource)){
				copyDir($subDirNameSource,$subDirNameDestination);//递归
			}else{
				//如果是文件,则从源目录拷贝到目标目录
				copy($subDirNameSource,$subDirNameDestination);
			}
		}
	}
	closedir($dir);
}
//调用函数
copyDir("hello","nihao");
//============================================================
//---------------------------文件下载-------------------------
/*
1.请求(顺序)
	1.HTTP 1.1 协议 版本
	2.头信息
	3.表单信息
2.响应(顺序)
	1.状态 200ok(正常) 或 404 (页面没找到)
	2.响应头信息
	3.数据发送
*/
//下载链接显示名
$fileName="hello.html";
//发送头信息
header('Content-Disposition: attachment; filename='.$fileName);
//读取文件并直接发送
readfile('hello.html');
//============================================================
//-------------------------文件上传---------------------------
	//php.ini配置文件中上传相关的选项
	
	//开启上传功能
	file_uploads = on
	//上传文件的最大值,勿超过内存大小
	upload_max_filesize = 20M
	//文件临时存储的位置,脚本执行完文件自动删除,一般不指定默认即可
	upload_tmp_dir = c:/upload/...
	//post所有值的最大尺寸,必须大于文件上传的值
	post_max_size = 25M
	
	//上传表单书写方式
	//1.必须用post方法提交
	//2.表单类型为type="file"
	//3.表单数据的编码方式enctype="multipart/form-data"
	//4.用$_FILES 接收表单信息
	//5.多文件上传时将表单name名改为数组形式name="pic[]"
	/* 
	<form action="" method="post" enctype="multipart/form-data" >
		<input type="file" name="pic[]" />
		<input type="file" name="pic[]" />
		//上传文件超过指定值时的提示
		<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
	</form>
	*/
	//$_FILES 数组中的信息
	/*Array
	(
		[pic] => Array
			(
				[name] => Angelababy03.jpg
				[type] => image/jpeg
				[tmp_name] => C:\Windows\Temp\phpE9FF.tmp
				[error] => 0
				[size] => 78558
			)
	)*/
//------------------------------------------------------------
//--------------------------上传处理方法---------------------
//1.使用$_FILES['pic']['error']检查错误
if($_FILES["pic"]["error"] > 0){		//其值为 0,没有错误发生,文件上传成功
	switch($_FILES["pic"]["error"]) {
		case 1:	echo "其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";break;
		case 2:	echo "其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";break;
		case 3: 	echo "其值为3,文件只有部分被上传";break;
		case 4:	echo "其值为4,没有文件被上传";break;
		case 6:	echo "其值为6,找不到临时文件夹";break;
		case 7:	echo "其值为7,文件写入失败";break;
		default: echo "末知错误";
	}
	exit;
}

//2.使用$_FILES['pic']['size']限制大小 单位字节 1M=1000 000(约)
if($_FILES["pic"]["size"] > $maxsize ) {
	echo "上传的文件太大,不能超过{$maxsize}字节";
	exit;
}

//3.判断文件类型
//使用$_FILES['pic']['type']或文件的扩展名限制类型
$types = ['jpg','jpeg','png','gif'];
$hz = pathinfo($_FILES['pic']['name'],PATHINFO_EXTENSION);
if(!in_array($hz,$types)){
	echo "文件类型错误";
	exit;
}

//4.让上传后的文件改名
$filepath="./uploads/";
$randname=date("YmdHis").uniqid().rand(100, 999).".".$hz;
//将临时位置的文件移动到指定的目录上即可
if(is_uploaded_file($_FILES["pic"]["tmp_name"])){
	if(move_uploaded_file($_FILES["pic"]["tmp_name"], $filepath.$randname)){
		echo "上传成功";
	}else{
		echo "上传失败";
	}
}else{
	echo "不是一个上传文件";
}
//============================================================
//------------------------------------------------------------

disk_free_space("url")		//返回目录中的可用空间
disk_total_space("url")		//返回一个目录的磁盘总大小

fscanf("$string","%s\t%s\t%s\n")//从文件中格式化输入
lstat(file)					//返回文件属性等信息
tempnam()					//建立一个具有唯一文件名的文件
symlink()					//建立符号连接
fstat($file)					//通过已打开的文件指针取得文件信息
linkinfo(url)					//获取一个连接的信息
popen(command,mode)		//打开进程文件指针
							//command	命令
							//mode		r或w
//=============================================================
//-------------------------------------------------------------
//****************************读取文件**************
fgetcsv 			//从文件指针中读入一行并解析 CSV 字段
fgetss 			//从文件指针中读取一行并过滤掉 HTML 标记
//****************************文件操作**************
clearstatcache 	//清除文件状态缓存
//****************************输出******************
fpassthru 		//输出文件指针处的所有剩余数据
//****************************新建******************
tmpfile 			//建立一个临时文件
tempnam		//建立一个具有唯一文件名的文件
 //**************************文件名或路径名*********
pathinfo*		//返回文件路径的信息
realpath 		//返回规范化的绝对路径名
glob 			//寻找与模式匹配的文件路径
readlink 			//返回符号连接指向的目标
//****************************文件中操作************
fscanf 			//从文件中格式化输入
fflush 			//将缓冲内容输出到文件
pclose 			//关闭进程文件指针
popen 			//打开进程文件指针
fputcsv 			//将行格式化为 CSV 并写入文件指针
ftruncate 		//将文件截断到给定的长度
//**************************取得文件信息************
fileinode 		//取得文件的 inode
fileperms 		//取得文件的权限
fstat* 			//通过已打开的文件指针取得文件信息
linkinfo 			//获取一个连接的信息
lstat 			//给出一个文件或符号连接的信息
parse_ini_file 	//解析一个配置文件
//**************************其他*********************
set_file_buffer 	//stream_set_write_buffer()的别名
fnmatch 			//用模式匹配文件名
link 				//建立一个硬连接
symlink 			//建立符号连接
//-------------------------------------------------------------
//=============================================================