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 "Dir".$dirname."contain : ";
echo "
";
echo "filenamefilesizefiletypechangeddate";
while ($file=readdir($dir_handle)) {
# code...
$dirFile=$dirname."/".$file;
if ($num++%2==0) {
# code...
$bgcolor='#ffffff';
}
else{
$bgcolor='#cccccc';
}
echo "
";
echo "".$file."";
echo "".filesize($dirFile)."";
echo "".filetype($dirFile)."";
echo "".date("Y/n/t",filemtime($dirFile))."";
echo "";
}
echo "";
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);
?>