PHP 文件系统详解
前端之家收集整理的这篇文章主要介绍了
PHP 文件系统详解,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
文件处理函数
1.文件操作.
打开
文件:
打开指定的
文件时会返回相应的对象,若不存在指定的
文件,那麽可能会
自动创建这个
文件。
resource fopen(string filename,string mode [,int use_include_path][,resource context]);
filename 可以是包含
文件路径的
文件名,也可以是某种协议给出的URL(打开远程
文件).为了避免系统切换带来的麻烦,采用'/'作为路径分隔符.
mode: 设置打开
文件的方式,分别有:
r:只读模式,
文件指针位于
文件头部.
r+:只读模式----读/写模式,
文件指针位于头部
文件.注意可能产生覆盖.
w:只写模式,
文件指针位于
文件头部.如果
文件存在,
删除内容重写;否则,自行创建
文件.
w+:只写模式----读写
文件,读/写
文件指针指向
文件头部.如果
文件存在,自行创建
文件.
x:谨慎写----写模式打开
文件,从
文件头部开始写如.如果
文件存在,返回false,产生一个E_WARNING级别的
错误信息
x+:谨慎写---读写模式代开
文件.如果
文件存在,产生一个E_WARNING级别的
错误信息
a:追加,
文件指针指向
文件尾部.如果
文件存在,则直接在
文件尾追加;否则,自行创建
文件.
a+:追加,则直接在
文件尾追加或者读取;否则,自行创建
文件.
b:二进制模式.用于与其他模式进行
链接.(windows 下的选项)
t: 用于与其他模式进行结合.(windows 下的选项)
请慎用fopen()
函数,因为一不小心就有可能将
文件删除掉.同时,不同的操作系统具有不同的行结束习惯(UNIX:\n Windows:\r\n Macinitosh:\r).如果
错误的使用行结束符,那么当打开
文件时,可能
输出一堆乱码.以上可以通过"'t'","'b'"来避免.
string fgetc(resource handle);//返回从handle指向的
文件中的一个字符.如果遇到EOF,则返回false;
string fgets(int handle[,int length]);//从
文件指针指向的位置
获取一行字符,并且返回最大为length-1个字节的字符串..
文件指针必须有效,且指向一个由fopen()或fsockopen()成功打开的
文件.length表示读取的数据的长度.在遇到换行,EOF,或者指定length时结束.忽略length将读到行结束.
string fgetss(resource handle[,int length][,string allowable_tags]);//读取一行,且过滤掉html,
PHP标记.
string fread(int handle,int length);//从
文件中读取任意长度的数据。,还可以用于读取二进制
文件。handle 为指向
文件的资源,length 读取length个字节或者遇到EOF时停止执行。
例子:
<div class="codetitle">
<a style="CURSOR: pointer" data="48455" class="copybut" id="copybut48455" onclick="doCopy('code48455')"> 代码如下: <div class="codebody" id="code48455">
<?
PHP $filename="./files.text";
$fp=fopen($finename,"rb");
$encho fread($fp,100);
?>
readfile(),file()和file_get_contents()
函数.
readfile(),file()和file_get_contents()
函数.
int readfile(string filename[,bool use_include_path,resource context]);//读取一个
文件并写入到缓冲区,如果成功,则返回读取的字节数,否则返回false。filename
文件名。参数use_include_path控制是否
支持在include_path中
搜索文件,true为
支持。使用readfile
函数不需要打开/
关闭文件。
array file(string filename [,bool use_include_path[,resource context]]);//将整个
文件的
内容读取到数组中。如果成功,返回数组,数组中的每个元素都是
文件中对应的一行,包活换行符在内;否则返回false;
string file_get_contents(string filename[,resource context[,int offset[,int maxlen]]]]);//context 为5.0新增的
内容,可以用NULL来忽略。offset,maxlen为5.1的的
内容。offset 用于
标记文件啓始的位置,maxlen 设置
文件读取的长度。该
方法适用于二进制
文件的读取。是将
文件内容读入到一个字符串的首选
方法。如果操作系统
支持,还会使用内存映射技术来增强
性能。如果打开有特殊字符的URL(例如存在空格),那麽要使用urlencode()来进行URL编码。 备注:readfile(),file()和file_get_contents()在读取整个
文件夹中的
内容时,不需要使用fopen()和fclose()
函数,但是在读取一个字符,一行字符和任意长的字符时则必须使用。
2.写入文件:
int fwrite(resource handle,string[,int length]);//执行
文件的写入操作,它还有一个别名fputs().该
方法用于把string的
内容写入
文件指针handle处。如果设置length,那麽写入length个字节或者完成string写入后,操作就会停止。成功写入则返回true,否则返回false。
备注:若给出length参数,那麽
PHP.ini
文件中的magic_quotes_runtime选项将会被忽略,而string中的斜线将不会被抽去。区分二进制
文件和文本
文件系统则在打开
文件时fopen()
函数的mode参数要
加上‘b'。
int file_put_contents(string filename,string data[.int flags[,resource context]]);//将一个字符串写入
文件中,如果成功则返回字节数,否则返回false。flags:实现对
文件的锁定(选项有 file_use_include_path,file_append:追加,lock_ex:独佔锁定)。context一个context资源。
备注:fwrite()虽然具备写入
文件的
功能,但是必须有fopen()和fclose()
函数的
支持。file_put_contents()整合了fopen(),fwrite(),fclose()
功能,可以单独完成
文件的写入。
文件有打开就应该有
关闭功能,对
文件的操作结束后,应该
关闭这个
文件,否则可能引起
错误。
bool fclose(resouce handle);//将参数handle指向的
文件关闭,如果成功则返回true,否则返回false。
在向一个文本
文件中写入数据的时候,需要先锁定
文件,已防止其他
用户同时也
修改此
文件的
内容。
PHP中通过flock()
函数实现
文件的锁定。
bool flock(int handle,int operation);//参数operation控制锁定权限。
包括:lock_sh:取得共享锁定(读取程序)。lock_ex:取得独佔锁定(写入)。lock_un:释放锁定。lock_nb:防止flock()
函数在锁定时堵塞。
目录是一种特殊的
文件。既然是
文件,如果对其进行操作,同样必须先打开,然后才可以进行浏览操作,最后还要记得
关闭。
1.打开目录
打开指定的目录
文件,若果成功,则返回目录的句柄。否则返回false。与打开
文件不同的是,若目录不存在,它并不会
自动创建目录,而是抛出一个
错误信息。通过在opendir()
函数前加“@”符号,可以
屏蔽错误信息的
输出。
resource opendir(string path[,resource context]);//path指定要打开的目录
文件。如果path指定的不是一个有效的目录,或者因为权限问题,
文件系统
错误不能打开,那麽该
函数将会返回false,并且产生一个E_WARNING级别的
错误信息。
2.浏览目录
利用opendir
函数返回的句柄配合scandir
函数实现浏览操作。
array scandir(string directory[,int sorting_ordering[,resource context]]);//用于浏览指定路径下的目录和
文件。如果成功则返回包含
文件名的array,否则返回false。directory指定要浏览的目录,如果不是目录,那麽将返回false,并且产生一个E_WARNING级别的
错误信息。sorting_order设置排列顺序,默认为字母升序排列。如果带上该参数,则变为降序排列。
备注:is_dir()
函数,判断指定
文件名是否一个目录。如果
文件名存在且为目录,则返回true,否则返回false。如果是相对目录,则按照当前工作目录检查其相对路径。
3.关闭目录。
void closedir(resource handle);//handle,要
关闭的工作目录的句柄。 备注:前面已经了解到,若打开的目录不存在,系统并不会帮我们创建目录。那麽我们可以自行创建想要的目录。可以应用以下
函数:
mkdir()
函数:新建一个目录,成功则返回true,否则false。
rmdir()
函数:
删除目录。目录必须为空(目录中无
文件或者子目录),且要有操作的权限。
unlink()
函数:
删除文件,成功则返回true,失败返回false。
步骤
内容:
步骤1:控制
上传文件,通过
PHP.ini
文件配置。
步骤2:对
上传文件进行判断。
上传文件的大小,格式等。
步骤3:执行
上传文件的操作
方法。
PHP通过对
PHP.ini对
上传文件进行控制,
包括:是否
支持上传、
上传文件的临时目录、
上传文件的大小、指令执行的时间与指令分配的内存空间。
在
PHP.ini
文件中定位到file uploads选项,完成对上述选项的设置。选项含义如下:
file_uploads:如果是on,说明服务器
支持文件上传,如果为off,则
不支持。一般默认是
支持的,此选项不必
修改。
upload_tem_dir:
上传文件的临时目录。在
文件上传成功之前,
文件首先保存在服务器的临时目录中。多数使用系统默认目录,但是也可以自行设置。
upload_max_filesize:服务器允许
上传文件的最大值,以MB为单位。系统默认为2MB,若超过则须
修改其值。
max_execution_time:
PHP中一个指令所能执行的最长时间,单位是秒。该指令在执行
上传超大
文件时必须
修改,否则及时
上传文件在服务器允许的范围内,但是超过指令所能执行的最长时间,仍然无法实现
上传。
memory_limit:
PHP中一个指令所分配的内存空间,单位时MB。它的大小同样会影响到超大
文件的
上传。 备注:在客户端中控制
上传文件应用的时form表单中的enctype和method
属性,以及隐藏域MAX_FILE_SIZE.
enctype="multipart/form-data":指定表单编码数据方式。
method="post":指定数据传输的方式。
<input type="hiden" name="MAX_FILE_SIZE" value="1000"/>:通过隐藏域控制
上传文件的大小,单位为字节。该值不能超过
PHP.ini
配置文件中的upload_max_filesize选项设置的值。它不能完全控制
上传文件的大小,只能避免一些不必要的麻烦。
对
上传文件进行判断应用的是
全局变量$_FILES,$_FILES是一个数组,它包含所有
上传文件的信息。数组中各个元素含义如下:
$_FILES[filename][name]:存储
上传文件的
文件名,如text.txt,title.jpg等。
$_FILES[filename][size]:存储
文件的大小,单位为字节。
$_FILES[filename][tem_name]:存储
文件在临时目录中使用的
文件名,因为
文件在
上传时首先要将其以临时
文件的身份存储在临时目录中。
$_FILES[filename][type]:存储
上传文件的MIME类型。MIME规定各种
文件格式的类型,每种MIME类型都时由“/”分隔的主类型和子类型组成。例如:"image/gif"的主类型为图像,子类型为GIF格式的
文件。"text/html"代表文本的HTML
文件。
$_FILES[filename][error]:存储
文件上传的
错误代码:此项目为
PHP4.2.0版本中新增
内容。它的返回值由5种:
0:表示没有任何
错误。
文件上传成功。
1:表示
上传文件的大小超出
配置文件指令upload_max_filesize选项的限定值。
2:表示
上传文件的大小超出HTML表单中max_file_size选项所指定的值。
3:表示
文件只被
上传了一部分。
4:表示没有
上传任何
文件。
例子:
<div class="codetitle">
<a style="CURSOR: pointer" data="40169" class="copybut" id="copybut40169" onclick="doCopy('code40169')"> 代码如下: