PHP 与文件系统处理

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() : 返回一个关联数组。其中包括指定路径中的目录名、基本名和扩展名三个部分。分别通过组键dirnamebasenameextension引用。


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 :

filenamefilesizefiletypechangeddate
".$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; //初始size0


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.若文件是以aa+模式打开,则写入文件的任何数据都会被附加在后面,无视文件指针位置。

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);

?>


你可能感兴趣的:(web相关,读书笔记,PHP,文件系统)