PHP 文件处理13
PHP 文件处理
PHP 文件处理
PHP 提供了丰富的文件处理函数。文件处理主要包括:
文件创建/打开
fopen:(创建并)打开一个文件或 URL 地址。
文件写入
fwrite:向文件写入内容,可安全用于二进制文件 。
file_put_contents:向文件写入内容,等同依次调用 fopen,fwrite 以及 fclose 函数。
文件读取
fread:读取文件,可安全用于二进制文件。
fgets:从文件中读取 一行 数据,并将文件指针指向下一行。
fgetc:从文件中 逐字 读取文件数据,直到文件结束。
file_get_contents:把 整个文件 读入一个字符串。
file:把 整个文件 读入一个数组中,数组中的每个单元都是文件中相应的一行。
检查文件是否存在
file_exists:检查文件或目录是否存在。
检查文件是否可读写执行
is_readable:检查文件是否可读。
is_writable:检查文件是否是否可写入。
is_executable:检查文件是否可执行。
文件拷贝
copy:拷贝文件。
文件删除
unlink:删除文件。
取得文件大小、类型、修改时间信息
filesize:取得文件大小。
filetype:取得文件类型。
filemtime:取得文件修改时间。
文件指针函数
fclose:关闭文件指针。
feof:测试文件指针是否到了文件结束的位置。
fseek:在文件指针中定位。
rewind:倒回文件指针的位置。
ftell:返回文件指针读/写的位置。
提示:关于目录的处理请参看《PHP 目录》章节。
is_file()
is_file() 函数用于检查给定文件名是否为一个正常的文件,如果文件存在且为正常的文件则返回 TRUE ,否则返回 FALSE 。
语法:
bool is_file ( string filename )
例子:
<?php
var_dump(is_file('test.txt'));
var_dump(is_file('php'));
?>
运行例子输出:
bool(true)
bool(false)
参考阅读
is_dir 函数:检查给定文件名是否为一个目录。
提示
操作文件及目录时,需要注意文件目录的读、写、删权限。
PHP 文件创建与打开 fopen 函数
fopen() 函数用于打开一个文件或 URL 地址。
fopen() 打开文件
PHP 中没有单独的文件创建函数,创建和打开文件都是用 fopen() 函数。当使用 fopen() 函数打开一个文件时,如果文件不存在,则会尝试创建该文件,并返回一个资源。
如果打开失败,本函数返回 FALSE 。
语法:
resource fopen( string filename, string mode )
参数 filename 为尝试打开/创建的文件名,参数 mode 指定了打开模式,其可能的值如下:
打开模式 说明
r 只读,并将文件指针指向文件开始位置
r+ 读写,将文件指针指向文件开始位置
w 只写,将文件指针指向文件开始位置并将文件内容清空,如果文件不存在则尝试创建之
w+ 读写,将文件指针指向文件开始位置并将文件内容清空,如果文件不存在则尝试创建之
a 追加,将文件指针指向文件末尾来操作,如果文件不存在则尝试创建之
a+ 读写追加,将文件指针指向文件末尾来操作,如果文件不存在则尝试创建之
x 只写,并创建文件,如果文件已存在,则 fopen() 调用失败并返回 FALSE
x+ 读写,并创建文件,如果文件已存在,则 fopen() 调用失败并返回 FALSE
关于文件指针,参见《PHP 文件指针函数》。
创建一个文件的例子:
<?php
if(!file_exists("test.txt")){ //如果文件不存在(默认为当前目录下)
$fh = fopen("test.txt","w");
fclose($fh); //关闭文件
}
?>
提示:上述例子中如果 test.txt 已经存在,则不会创建新文件。
fopen() 打开 URL 地址
fopen() 函数还可用于打开互联网上的 URL 地址:
<?php
$fh = fopen("http://www.baidu.com/", "r");
if($fh){
while(!feof($fh)) {
echo fgets($fh);
}
}
?>
运行该例子,页面将显示百度首页。
注意:fopen() 返回的只是一个资源,要想显示打开的页面地址,还需要用 fgets() 函数读取并输出。
PHP fwrite 函数:将字符串写入文件(追加与换行)
PHP fwrite()
fwrite() 函数用于向文件写入字符串,成功返回写入的字符数,否则返回 FALSE 。
语法:
int fwrite( resource handle, string string [, int length] )
fwrite() 把 string 的内容写入文件指针 handle 处。
参数说明: 参数 说明
handle 要写入字符串的文件指针,一般由 fopen() 函数创建
data 要写入的字符串
length 可选,规定要写入的最大字节数
如果指定了可选参数 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止。
例子:
<?php
// 要写入的文件名字
$filename = 'file.txt';
// 写入的字符
$word = "你好!";
$fh = fopen($filename, "w");
echo fwrite($fh, $word); // 输出:6
fclose($fh);
?>
执行该例子程序,在程序同目录下,file.txt 文件内容为:你好!
使用 length 参数
上面的例子中,如果使用了 length 参数,则至多写入 length 个字符串:
echo fwrite($fh, $word, 4); // 输出:4
PHP fwrite 追加写入
对文件的追加写入,实际与 fwrite 函数无关,而与 fopen 函数打开文件的模式有关。当 fopen 打开文件时,mode 参数选择 a ,则表示在文件后面追加写入:
<?php
$filename = 'file.txt';
$word = "你好!";
$fh = fopen($filename, "a");
echo fwrite($fh, $word);
fclose($fh);
?>
PHP fwrite 换行写入
如果要在文件中实现换行写入,只需要在写入内容中需要换行的地方添加换行符 n 即可:
<?php
$filename = 'file.txt';
$word = "你好!n";
$fh = fopen($filename, "a");
echo fwrite($fh, $word);
fclose($fh);
?>
上面的例子在内容结尾添加了 n 换行符。要让 n 在写入文件时表示换行,写入时需使用双引号(如上面例子),如果使用单引号,n 字符不会被解释为换行而是当做 n 字符串,点击查看:PHP 字符串中单引号与双引号的区别。
n 已经是真正意义上的换行,在 windows 操作系统上如果要模拟回车换行(即用写字板打开文件时,不是黑方块而是一行一行的列出),可以在 n 前面加入 r 回车符:
<?php
$word = "你好!rn";
?>
PHP fwrite 写入权限
当打开一个已经存在的文件(通常是追加写入模式下),有必要检测该文件是否具有写入权限,从而避免一个系统错误的发生。使用 is_writable 函数检测文件是否可写。
下面是追加写入模式下一个比较严格检查的例子:
<?php
$filename = 'file.txt';
$word = "你好!n";
// 确定文件存在并且可写
if (is_writable($filename)) {
//打开文件
if (!$fh = fopen($filename, 'a')) {
echo "不能打开文件 $filename";
exit;
}
// 写入内容
if (fwrite($fh, $word) === FALSE) {
echo "不能写入到文件 $filename";
exit;
}
echo "成功地将 $word 写入到文件 $filename";
fclose($fh);
} else {
echo "文件 $filename 不可写";
}
?>
PHP fwrite 函数只是执行向文件写入字符串的动作,实际它的行为结果取决于 fopen 函数更多一些。如果想一次性将字符串写入或追加至文件,file_put_contents 函数可能是更优的选择。
参考阅读
PHP fopen:文件创建与打开。
PHP file_put_contents:一次性向文件写入或追加字符串。
PHP close:关闭一个打开的文件
PHP file_put_contents 函数:将字符串写入或追加到文件
PHP file_put_contents() 函数是一次性向文件写入字符串或追加字符串内容的最合适选择。
file_put_contents()
file_put_contents() 函数用于把字符串写入文件,成功返回写入到文件内数据的字节数,失败则返回 FALSE。
语法:
int file_put_contents ( string filename, string data [, int flags [, resource context]] )
参数说明: 参数 说明
filename 要写入数据的文件名
data 要写入的数据。类型可以是 string,array(但不能为多维数组),或者是 stream 资源
flags 可选,规定如何打开/写入文件。可能的值:
FILE_USE_INCLUDE_PATH:检查 filename 副本的内置路径
FILE_APPEND:在文件末尾以追加的方式写入数据
LOCK_EX:对文件上锁
context 可选,Context是一组选项,可以通过它修改文本属性
例子:
<?php
echo file_put_contents("test.txt", "This is something.");
?>
运行该例子,浏览器输出:
18
而 test.txt 文件(与程序同目录下)内容则为:This is something.。
提示
如果文件不存在,则创建文件,相当于fopen()函数行为。
如果文件存在,默认将清空文件内的内容,可设置 flags 参数值为 FILE_APPEND 以避免(见下)。
本函数可安全用于二进制对象。
以追加形式写入内容
当设置 flags 参数值为 FILE_APPEND 时,表示在已有文件内容后面追加内容的方式写入新数据:
<?php
file_put_contents("test.txt", "This is another something.", FILE_APPEND);
?>
执行程序后,test.txt 文件内容变为:This is something.This is another something.
file_put_contents() 的行为实际上等于依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
参考阅读
PHP fopen:文件创建与打开。
PHP fwrite:向文件写入字符串。
PHP close:关闭一个打开的文件。
PHP file_get_contents:把整个文件内容读入一个字符串。
PHP 文件读取 fread、fgets、fgetc、file_get_contents 与 file 函数
fread()、fgets()、fgetc()、file_get_contents() 与 file() 函数用于从文件中读取内容。
fread()
fread() 函数用于读取文件(可安全用于二进制文件)。
语法:
string fread( int handle, int length )
fread() 从文件指针 handle 读取最多 length 个字节。当遇到下列任何一种情况时,会停止读取文件:
在读取完最多 length 个字节数时
达到文件末尾的时候(EOF)
(对于网络流)当一个包可用时
或(在打开用户空间流之后)已读取了 8192 个字节时
从文件中读取 10 个字节(包括空格):
<?php
$filename = "test.txt";
$fh = fopen($filename, "r");
echo fread($fh, "10");
fclose($fh);
?>
提示
如果只是想将一个文件的内容读入到一个字符串中,应该用性能更好的 file_get_contents() 。
fgets()
fgets() 函数用于从文件中读取 一行 数据,并将文件指针指向下一行。
提示:如果想在读取的时候去掉文件中的 HTML 标记,请使用 fgetss() 函数。
语法:
string fgets( int handle [, int length] )
fgets() 从 handle 指向的文件中读取一行并返回长度最多为 length-1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length-1 字节后停止。如果没有指定 length ,则默认为 1K ,或者说 1024 字节。
例子:
<?php
$fh = @fopen("test.txt","r") or die("打开 test.txt 文件出错!");
// if条件避免无效指针
if($fh){
while(!feof($fh)) {
echo fgets($fh), '<br />';
}
}
fclose($fh);
?>
补充说明
feof() 函数测试文件指针是否到了文件结束的位置,该文件指针必须有效,如果是无效的资源,则会陷入无限循环中。参见《PHP 文件指针函数》
fgetc()
fgetc() 函数用于 逐字 读取文件数据,直到文件结束。
语法:
string fgetc( resource handle )
例子:
<?php
$fh = @fopen("test.txt","r") or die("打开 test.txt 文件出错!");
if($fh){
while(!feof($fh)) {
echo fgetc($fh);
}
}
fclose($fh);
?>
file_get_contents()
file_get_contents() 函数用于把 整个文件 读入一个字符串,成功返回一个字符串,失败则返回 FALSE。
语法:
string file_get_contents( string filename [, int offset [, int maxlen]] )
参数说明: 参数 说明
filename 要读取的文件名称
offset 可选,指定读取开始的位置,默认为文件开始位置
maxlen 可选,指定读取文件的长度,单位字节
例子:
<?php
// 读取时同事将换行符转换成 <br />
echo nl2br(file_get_contents('test.txt'));
?>
file()
file() 函数用于把 整个文件 读入一个数组中,数组中的每个单元都是文件中相应的一行,包括换行符在内。成功返回一个数组,失败则返回 FALSE。
语法:
array file( string filename )
例子:
<?php
$lines = file('test.txt');
// 在数组中循环并加上行号
foreach ($lines as $line_num => $line) {
echo "Line #{$line_num} : ",$line,'<br />';
}
?>
test.txt 文件内容:
你好!
这是第二行文字。
浏览器显示:
Line #0 : 你好!
Line #1 : 这是第二行文字。
PHP 检查文件是否存在 file_exists 函数
file_exists() 函数用于检查一个文件或目录是否存在。
file_exists()
file_exists() 函数检查文件或目录是否存在,成功返回 TRUE,否则返回 FALSE 。
语法:
bool file_exists( string filename )
例子:
<?php
$filename = 'test.txt';
if (file_exists($filename)) {
echo "文件 $filename 存在";
} else {
echo "文件 $filename 不存在";
}
?>
PHP 检查文件能否读写执行 is_readable、is_writable 与 is_executable 函数
is_readable() 函数用于检查文件是否可读,is_writable() 函数用于检查文件是否可写入,is_executable() 函数用于检查文件是否可执行。
is_readable()
is_readable() 函数用于检查文件是否可读,指定的文件或目录存在并且可读则返回 TRUE,否则返回 FALSE。
语法:
bool is_readable( string filename )
例子:
<?php
$filename = "test.text";
if (is_readable($filename)) {
echo "文件 $filename 可读";
} else {
echo "文件 $filename 不可读";
}
?>
is_writable()
is_writable() 函数用于检查文件是否可写入,如果文件存在并且可写则返回 TRUE,否则返回 FALSE。
语法:
bool is_writable( string filename )
filename 参数可以是一个允许进行是否可写检查的目录名。
例子:
<?php
$filename = "test.text";
if (is_writable($filename)) {
echo "文件 $filename 可写";
} else {
echo "文件 $filename 不可写";
}
?>
is_executable()
is_executable() 函数用于检查文件是否可执行,如果文件存在且可执行则返回 TRUE,否则返回 FALSE。用法请参考 is_writable() 。
PHP 文件拷贝 copy 函数
copy() 函数用于拷贝一个文件。
copy()
copy() 函数用于拷贝文件,如果成功则返回 TRUE,失败则返回 FALSE。
语法:
bool copy( string file, string newfile )
例子:
<?php
if (copy('test.txt', 'test.txt.bak')) {
echo "文件拷贝成功";
} else {
echo "文件拷贝失败";
}
?>
PHP 文件删除 unlink 函数
unlink() 函数用于删除文件。
unlink()
unlink() 函数用于删除一个文件,如果成功则返回 TRUE,失败则返回 FALSE。
语法:
bool unlink( string filename )
例子:
<?php
unlink("test.txt");
?>
参考阅读
rmdir():删除目录。
PHP 取得文件大小、类型、修改时间等信息
目录
filesize():取得文件大小
filetype():取得文件类型
filemtime():取得文件修改时间
filesize()
filesize() 函数用于取得文件大小,成功返回文件大小的字节数,否则返回 FALSE 。
语法:
int filesize( string filename )
例子:
<?php
$filename = 'test.txt';
echo $filename.'文件大小为: '.filesize($filename).' bytes';
?>
提示
filesize() 函数在碰到大于 2GB 的文件时可能会返回非预期的结果。对于 2GB 到 4GB 之间的文件通常可以使用 sprintf("%u", filesize($file)) 来克服此问题。
filetype()
filetype() 函数用于取得文件类型,成功返回返回文件的类型,可能的值有 fifo,char,dir,block,link,file 和 unknown 。错误则返回 FALSE 。
语法:
string filetype( string filename )
例子:
<?php
$filename = 'test.txt';
echo filetype($filename); //输出 file
?>
filemtime()
filemtime() 函数用于检查文件修改时间,成功返回文件上次被修改的时间戳,否则返回 FALSE。
语法:
int filemtime( string filename )
例子:
<?php
$filename = "test.txt";
echo "$filename 修改日期为:",date("Y-m-d H:i:s",filemtime($filename));
?>
运行例子输出:
test.txt 修改日期为:2010-12-31 23:30:22
参考阅读:
《PHP 时间戳 timestamp》
《PHP date 函数格式化时间》
PHP 文件指针函数
PHP 文件指针
文件指针通俗的理解就像是平常操作文档时鼠标指针的位置。PHP 提供了丰富的文件指针函数供使用:
fclose():关闭文件指针。
feof():测试文件指针是否到了文件结束的位置。
fseek():在文件指针中定位。
rewind():倒回文件指针的位置。
ftell():返回文件指针读/写的位置。
fclose()
fclose() 函数用于关闭一个已打开的文件指针(将 handle 指向的文件关闭),如果成功则返回 TRUE,失败则返回 FALSE 。
语法:
bool fclose( resource handle )
例子:
<?php
$fh = fopen("test.txt","r");
fclose($fh);
}
?>
文件指针必须有效,并且是通过 fopen() 或 fsockopen() 成功打开的。
feof()
EOF(End Of File,文件结束位置)是文件处理中非常重要的概念,在 PHP 中提供了 feof() 函数来检测是否达到了 EOF。关于 EOF 更多介绍参看百度百科:http://baike.baidu.com/view/56074.htm
如果文件指针到了 EOF 或者出错时则返回 TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE。
语法:
bool feof( resource handle )
例子:
<?php
$fh = @fopen("test.txt","r") or die("打开 test.txt 文件出错!");
// if条件避免无效指针
if($fh){
while(!feof($fh)) {
echo fgets($fh), '<br />';
}
}
fclose($fh);
?>
重要提示
如果传递的文件指针无效可能会陷入无限循环中,因为 EOF 不会返回 TRUE。所以在使用 feof() 函数之前对文件指针的有效性进行检测是十分必要的。
fseek()
fseek() 函数用于在文件指针中定位,成功则返回 0 ,否则返回 -1 。
语法:
int fseek( resource handle, int offset [, int whence] )
参数说明: 参数 说明
handle 文件指针
offset 定位字节数
whence 可选,定位辅助说明,可能的值如下:
SEEK_SET:定位置等于 offset 字节
SEEK_CUR:设定位置为当前位置加上 offset
SEEK_END设定位置为文件尾加上 offset。(要移动到文件尾之前的位置,需要给 offset 传递一个负值。)
如果没有指定 whence,默认为 SEEK_SET。
例子:
<?php
$fh = fopen('test.txt', 'r');
fseek($fh, 5);
echo ftell($fh); //输出:5
?>
提示:该函数可能不能用于在 fopen() 中以 "http://" 或 "ftp://" 格式打开所返回的文件指针。
rewind()
rewind() 函数用于倒回文件指针的位置到开头,如果成功则返回 TRUE,失败则返回 FALSE 。
语法:
bool rewind( resource handle )
例子:
<?php
$fh = fopen("test.txt","r");
rewind($fh);
echo ftell($fh); //输出:0
?>
ftell()
ftell() 函数用于返回文件指针读/写的位置,成功返回 0 ,出错返回 FALSE。
语法:
int ftell ( resource handle )
文件指针必须是有效的,且必须指向一个通过 fopen() 或 popen() 成功打开的文件,使用例子见上。