PHP 文件
在本教程中,我们将学习如何处理文件,包括使用各种方便的PHP文件函数来打开文件、关闭文件、从文件读取内容和写入内容到文件,以及测试文件是否结束。
文件是存储在硬盘等存储媒体上的字节序列。PHP提供了许多有用的函数,方便你有效地处理文件。
获取文件信息
文件路径
不同的平台有不同的方法来处理文件路径。例如,UNIX和Linux系统在文件路径中使用斜杠作为分隔符,如下所示:
/www/tmp/test.txt
而Windows系统使用反斜杠作为分隔符:
\www\temp\test.txt
PHP会自动将反斜杠转换为斜杠,因此使用以斜杠作为分隔符的文件路径是保险的。
从路径中获取文件名
为了从文件路径中获取文件名,可以使用basename()函数。它接受一个完整的文件路径作为参数并返回文件的名称。
下面的例子演示了如何从文件路径中提取文件名index.php:
<?php $path = '/wwww/include/index.php'; $filename = basename($path); echo $filename; // index.php
获取文件扩展名
要获得文件扩展名,可以使用pathinfo()函数,如下所示:
<?php $fn = './test.txt'; $ext = pathinfo($fn, PATHINFO_EXTENSION); echo $ext; // txt
获取文件大小
要获得文件的大小,可以使用filesize()函数。filesize函数将以字节为单位返回给定文件的大小,如果发生错误则返回false。
<?php $fn = './test.txt'; echo filesize($fn);
文件的时间属性
PHP提供了一些有用的函数来查询文件的时间属性。
- fileatime()返回文件的最后一次访问时间。
- filectime()返回文件最后更改的时间。
- filemtime()返回文件的最后修改时间。
上面的所有函数都返回一个UNIX时间戳,该时间戳是一个整数值,表示从1970-01-01 0点到给定日期时间之间的秒数。
要从UNIX时间戳获取日期和时间信息,可以使用getdate()函数。请看下面的例子:
<?php $fn = './test.txt'; // 获取最后一次修改时间 $ts = filemtime($fn); // 获取日期 $ta = getdate($ts); var_dump($ta);
打开文件
在对文件进行任何其他操作之前,首先需要线打开它。
要在PHP中打开文件,可以使用fopen()函数。该函数打开文件并返回一个文件句柄,该句柄是一个与文件关联的指针。通过文件句柄,您可以操作文件的内容。
fopen()函数有两个参数:
第一个参数是要打开的文件的名称
第二个参数指定打开的模式,指明将如何使用文件,例如打开文件用于读或写。
下面的示例演示如何打开一个名为Test.txt的现有文件用于读取:
$fh = fopen('./test.txt','r');
下表说明了可以传递给fopen()函数的模式值:
mode | 说明 |
---|---|
'r' | 只读方式打开,将文件指针指向文件头。 |
'r+' | 读写方式打开,将文件指针指向文件头。 |
'w' | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
'w+' | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
'a' | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
'a+' | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
'x' | 创建并以写入方式打开,将文件指针指向文件头。 如果文件已存在,则 fopen() 调用失败并返回 FALSE, 并生成一条 E_WARNING 级别的错误信息。 如果文件不存在则尝试创建之。 这和给 底层的 open(2) 系统调用指定 O_EXCL |
'x+' | 创建并以读写方式打开,其他的行为和 'x' 一样。 |
请注意,您可以将值b附加到mode参数,以指示该文件应被视为二进制文件。例如,rb模式表示以二进制的方式打开文件进行读取。
关闭文件
当脚本结束时,PHP会自动关闭所有打开的文件。但是,当你完成一个文件的操作,就关闭它都是一个很好的习惯。
要关闭文件,需要将文件句柄传递给fclose()函数,如下所示:
fclose($fh);
读取文件
PHP提供了一些有用的函数供读取文件的内容:
- fread()——读取文件的内容
- fgetc()——每次读取一个字符
- fgets()——每次读取一行
- file()——将所有文件的内容读入一个数组
- fgetcsv()——读取一行逗号分隔的值
- file_get_contents()——将整个文件读入一个字符串
- readfile()——显示整个文件内容,不需要调用fopen()函数。
下面的例子演示了如何将整个文件内容读取到一个字符串中:
<?php $fn = "./test.txt"; $fh = fopen($fn, "r"); $content = fread($fh, filesize($fn)); fclose($fh); echo $content;
或者更简单的:
$fn = "./test.txt"; $content = file_get_contents($fn); echo $content;
写入文件
要将内容写入文件,可以使用以下函数之一:
- fwrite()——将字符串写入文件。
- file_put_contents()——将字符串写入文件,而不需要调用fopen()函数。
下面的例子演示了如何使用fwrite()函数将字符串写入文件:
<?php $fn = "./test.txt"; $fh = fopen($fn,'w') or die('无法打开文件'); fwrite($fh,'写入内容1'); fwrite($fh,' 写入内容2'); fclose($fh);
还可以使用file_put_contents()函数将字符串写入文件:
<?php $fn = "./test.txt"; file_put_contents($fn, '使用file_put_contents 示例');
检测是否达到文件结尾
为了检测文件的结尾,可以使用feof()函数。当文件指针到达文件末尾时,它返回true,否则返回false。
当您要读取不知道文件有多大的文件时,需要经常将feof()函数与fread()或fgetc()函数一起使用。
下面的例子演示了如何使用feof()函数。我们使用fread()函数一次读取10个字符。
<?php $fh = fopen('./test.txt','r'); $content = ''; while(!feof($fh)){ $content .= fread($fh,10); } fclose($fh); echo $content;