PHP 与文件:
1.文件属性函数
函数名 |
作用 |
参数 |
返回值 |
file_exists() |
检查文件或目录是否存在 |
文件名 |
bool值,存在返回true |
filesize() |
获得文件大小 |
文件名 |
返回文件大小字节数,出差false |
is_readable() |
判断文件名是否可读 |
文件名 |
bool值 |
is_writable() |
判断文件名是否可写 |
文件名 |
bool值 |
is_executable() |
判断文件名是否可执行 |
文件名 |
bool值 |
filectime() |
获取文件的创建时间 |
文件名 |
UNIX时间戳 |
filemtime() |
获取文件的修改时间 |
文件名 |
UNIX时间戳 |
fileatime() |
获取文件的访问时间 |
文件名 |
UNIX时间戳 |
stat() |
获取文件大部分属性值 |
文件名 |
返回给定文件大部分有用信息数组 |
2.目录的基本操作
2.1 解析目录
函数basename() : 返回路径中的文件名部分
函数dirname() : 给出一个包含有指向一个文件的全路径的字符串。返回去掉文件名后的目 录名。
函数pathinfo() : 返回一个关联数组。其中包括指定路径中的目录名、基本名和扩展名三个部分。分别通过组键dirname、basename和extension引用。
2.2遍历目录
opendir() : 打开指定目录,接受一个目录的路径及目录名作为参数。函数返回值为可供其他目录函数使用的目录句柄(资源类型)。若不存在该目录或无访问权限,返回false。
readdir() :读取指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数,函数返回当前目录指针位置的一个文件名,并将目录指针向后移动一位。指针位于目录结尾时,因没有文件存在则返回false。
closedir():关闭指定目录,接收已经用opendir() 打开的可操作目录句柄作为参数。无返回值,运行后关闭打开的目录。
rewinddir(): 倒回目录句柄,接收已经用opendir() 打开的可操作目录句柄作为参数。将目录指针重置到目录开始处。
练习代码:
$num = 0;
$dirname = 'new';
@$dir_handle = opendir($dirname);
if ($dir_handle) {
# code...
echo " echo " echo " echo " while ($file=readdir($dir_handle)) { # code... $dirFile=$dirname."/".$file; if ($num++%2==0) { # code... $bgcolor='#ffffff'; } else{ $bgcolor='#cccccc'; }
echo " echo " echo " echo " echo " echo "
} echo "";
";Dir".$dirname."contain :
";
filename filesize filetype changeddate ";
";
"; ".$file." ";
".filesize($dirFile)." ";
".filetype($dirFile)." ";
".date("Y/n/t",filemtime($dirFile))." ";
closedir($dir_handle);
echo "there is ".$num." files in \"".$dirname."\"";
}
else
{
echo "wrong dirname";
}
?>
2.3 统计目录大小
例代码:
function dirSize($directory)
{
$dir_size=0; //初始size为0
if ($dir_handle=@opendir($directory)) {
# code...
while ($filename=readdir($dir_handle)) {
# code...
if ($filename!='.'&&$filename!='..') { //排除这两个特殊
# code...
$subfile = $directory."/".$filename; //得到路径
if (is_dir($subfile)) //若是目录,递归
$dir_size+=dirSize($subfile);
else if(is_file($subfile))//若是文件,直接计算大小
$dir_size+=filesize($subfile);
}
}
closedir($dir_handle);
return round($dir_size/pow(1024, 1) ,2); //转换成KB,保留两位小数
}
}
2.4 建立、删除目录
建立新目录:mkdir();
面对空目录:rmdir() 直接删除;
空目录里有文件:进入目录,unlink()将目录中文件一个一个删掉;
存在非空子目录:递归函数。
!关闭目录资源要在删除空目录之前完成。即closedir()函数需在rmdir()之前执行。
function delDir ($directory)
{
if (file_exists($directory)) { //判断是否存在该目录,若非则会rmdir犯错
# code...
if($dir_handle = @opendir($directory) )
{
while($file = readdir($dir_handle))
{
if($file!='.'&&$file!='..'){ //排除这两个特殊
$filename = $directory."/".$file; //获得全路径
if (is_dir($filename)) {
# code...
delDir($filename); //对于子目录,调用递归
}
if (is_file($filename)) {
unlink($filename);//对于文件,直接删除
}
}
}
closedir($dir_handle); //记得这个函数和remdir()的顺序
rmdir($directory); //删除空目录
}
}
else{
echo "directory is not exists!";
}
}
2.5 复制和移动目录
PHP未给出特定的函数,需要自定义一个递归函数实现。复制文件可使用copy(),创建目录用mkdir().
函数定义:遍历时若遇到普通文件,直接copy进行复制。若遍历遇到一个目录,则必须建立该目录,然后对该目录下的文件进行复制操作。若还有子目录,则使用递归重复操作。最终完成整个目录的复制。若是移动目录,则复制后进行目录删除即可。
function copyDir($dirSrc , $dirTo)
{
if (is_file($dirTo)) { // 若目标为文件,错误
# code...
echo "the destination address is not dir";
return ;
}
if (!file_exists($dirTo)) { //若目标目录不存在,创一个
# code...
mkdir($dirTo);
}
if ($dir_handle=@opendir($dirSrc)) {
# code...
while ($filename=readdir($dir_handle)) {
# code...
if ($filename!='.'&&$filename!='..') { //记得排除这两个特殊
# code...
$subSrcFile = $dirSrc."/".$filename;
$subToFile = $dirTo."/".$filename;
if(is_dir($subSrcFile)) //若是子目录,递归
copyDir($subSrcFile,$subToFile);
if(is_file($subSrcFile)) //若是普通文件,copy
copy($subSrcFile, $subToFile);
}
}
closedir($dir_handle); //关闭目录资源
}
}
由安全及跨平台考虑,尽量不要调用shell命令。
3.文件的基本操作
3.1文件的打开和关闭
打开文件即建立文件的各种有关信息,使文件指针指向该文件,与实体联系在一起,以便其他操作(如发起输入输出流)。关闭文件则断开指针与文件的联系,禁止再对该文件进行操作。对应函数分别为:
fopen():打开一个文件,并要指定如何使用它。即指定打开文件资源的文件模式。文件模式参数有r,r+,w.w+.x,x+,a,a+,b,t
fclose():一旦完成资源的处理,一定要将其关闭,否则可能出现错误。参数必须是fopen()或fsockopen()打开的已存文件指针。
3.2 写入文件
步骤:打开文件(可以写)-> 写入信息 → 关闭文件
fwrite() : 将参数内的字符串写入参数内指定的fopen打开的文件内。可选参数int表示写入的长度。返回写入字数或false。(=fputs() ).
file_put_contents($filename,$data): 函数功能等于 fopen()+fwrite()+fclose(); 若调用多次很显然只会保存最后一次写入的结果。
3.3 读取文件
读取文件内容函数:
函数 |
描述 |
fread() |
读取打开的文件 |
file_get_contents() |
将文件读入字符串 |
fgets() |
从打开的文件中返回一行 |
fgetc() |
从打开的文件中返回字符 |
file() |
把文件读入一个数组中 |
readfile() |
读取一个文件,并输出到输出缓冲 |
feof() |
返回是否文件结束位置 |
file_get_contents(): 将文件的内容读入到一个字符串中的首选方法。
3.4 移动文件指针
int ftell(resource handle) :以fopen()打开的合法的文件指针为参数,返回当前指针的位置偏移量。
int fseek(resource handle,int offset[,int whence]): 设置文件指针位置。缺省whence=SEEK_SET,设置指针位置为offset处。可选SEEK_CUR:设置位置为当前位置加上offset ,SSSK_END:设置指针位置为EOF处加上offset字节,此时offset必须为负值。函数成功执行返回0,反之返回-1.若文件是以a、a+模式打开,则写入文件的任何数据都会被附加在后面,无视文件指针位置。
bool rewind(resource handle): 将文件指针返回到指定资源的开头。
3.5文件锁定机制
flock(): 锁定函数。
锁定类型(上函数的第二个参数):
LOCK_SH:取得共享锁定(从文件中读取数据时使用)。
LOCK_EX:取得独占锁定(往文件内写数据时锁定);
LOCK_UN:释放锁定(无论共享或独占锁,都用它释放);
LOCK_NB:附加锁定(若不希望flock()在锁定时堵塞,应在上述锁定后加上该锁)
! file()函数只有在lock之前有用。根据编写的一个简单chat网页得到。
3.6文件一些基本操作函数
copy():复制文件
unlink():删除文件
ftruncate():截取长度
rename():重命名
4.1 文件上传
客户端设置:
1.enctype=”multipart/form-data” 指定表单编码数据方式。
2.method=”POST” 指明发送方式
服务器端通过PHP处理上传:
注意三方面信息: 1.设置PHP配置文件指令,精细调节PHP文件上传功能;2.$_FILES多维数组,用于存储各种与上传文件有关的信息;3.PHP文件上传处理函数,后续处理。
配置文件有关选项
指令名 |
默认值 |
功能描述 |
file_uploads |
ON |
确定是否接受HTTP文件上传 |
memory_limit |
8M |
设置脚本可以分配的最大内存量 |
upload_max_filesize |
2M |
限制PHP处理文件大小的最大值 |
post_max_size |
8M |
限制通过POST方法可以接受信息的最大值,此值应当大于upload_max_file的值 |
upload_tmp_dir |
NULL |
上传文件存放的临时路径,路径必须可写的 |
全局数组$_FILES中的元素说明
数组 |
描述 |
$_FILES[“myfile”][“name”] |
客户机端文件原名,包括扩展名 |
$_FILES[“myfile”][“size”] |
已上传文件大小,单位字节 |
$_FILES[“myfile”][“tmp_name”] |
上传后的文件在服务器的临时文件名。 |
$_FILES[“myfile”][“error”] |
错误信息: 0:无任何错误,上传成功 1:文件大小超出upload_max_filesize限制值 2:文件超出了表单中MAX_FILE_SIZE指定值 3:文件只被部分上载 4:没有上载任何文件 |
$_FILES[“myfile”][“type”] |
获取从客户端上传文件的MIME类型。该类型规定了各种文件格式的类型。每种MIME类型都是由 '/' 分隔的主类型和子类型组成。如“image/gif”,主类型为“图像”,子类型为GIF格式文件。 |
myfile:
处理函数:
bool is_uploaded_file():判断指定文件是否是HTTP POST上传的。
bool move_upload_file(): 将上传文件移动到新位置。
4.2 处理多个文件上传
在输入表单中指定不同的“name”属性值即可。
例三个输入文件
则$_FILES[“myfile”][“name”]存储所有上传文件名称信息,$_FILES[“myfile”][“name”][0]存储第一个上传文件名称。$_FILES[“myfile”][“type”][1]存储第二个上传文件的类型。
4.3 文件下载
简单文件下载:
PHP使用header()函数,发送网页头部信息至浏览器,通知将要下载文件的处理。
例:
$filename="test.gif";
header('Content-Type:image/gif');
header('Content-Disposition:attachment;filename='.$filename );
header('Content-Length:'.filesize($filename));
readfile($filename);
?>