13.2 文件操作
文件操作是PHP编程中经常使用到的,本节介绍与文件操作有关的函数。
13.2.1 打开文件
要对文件进行操作,首先要打开文件。在PHP中使用fopen()函数打开文件,语法如下:
function fopen ($filename, $mode, $use_include_path = null, $context = null) false|resource
参数filename是被打开的文件路径,mode是打开文件的模式。fopen中打开文件的mode可选值如表13-1所示。
如果需要在include_path中搜寻文件,可以将可选的第三个参数use_include_path设为’1’或true。该函数执行成功时返回文件指针资源,如果打开失败,本函数返回false。
fopen()使用示例如下:
<?php
$handle = fopen('1.jpg',r);
$handle = fopen('2.jpg',w);
$handle = fopen('3.png',r);
var_dump($handle);
resource(5) of type (stream)
13.2.2 读取文件
打开文件后可以使用一些函数读取文件。
1. fgets()
fgets()是从文件指针中读取一行,语法如下:
function fgets ($handle, $length = null) false|string
handle是用fopen()打开的文件句柄,length表示从handle指向的文件中读取一行并返回长度最多为length -1字节的字符串。碰到换行符(包括在返回值中)、EOF或者已经读取了length -1字节后停止(看先碰到哪一种情况)。如果没有指定length,那么默认为1KB,或者说1024字节。
假设fgets.php和test.txt在同一目录下。fgets.php里的代码如下:
<?php
$handle=fopen('test.txt','r');
if($handle){
while(($buffer=fgets($handle,4096)) !== false){
echo $buffer;
}
if(! feof($handle)){
echo "Error:unexpected fgets() fail\n";
}
fclose($handle);
}
test.txt里的内容如下:
abcdef
ghijk
lmn
opqrst
uvwxyz
执行以上代码,打印出来的结果为:
abcdef ghijk lmn opqrst uvwxyz
2. fgetc()
fgetc()可从文件指针中读取字符,语法如下:
function fgetc ($handle) false|string
handle文件指针必须是有效的,必须指向由fopen()或fsockopen()成功打开的文件(还未由fclose()关闭)。该函数返回一个包含有一个字符的字符串,这个字符从handle指向的文件中得到。碰到EOF则返回false。
用fgetc()读取test.txt里的内容,示例如下:
<?php
$fp=fopen('test.txt',r);
if(!$fp){
echo 'Could not open file somefile.txt';
}
while (false !==($char=fgetc($fp))){
echo "$char\n";
}
执行以上代码,在浏览器中的打印结果为:
a b c d e f g h i j k l m n o p q r s t u v w x y z
13.2.3 获得文件属性
文件的属性包括文件的上次访问修改时间、文件大小类型等信息。
1. fileatime()
fileatime()可取得文件上次访问的时间,失败时返回false,返回的是UNIX时间戳。语法如下:
function fileatime ($filename) false|int
使用示例如下:
<?php
$filename='test.txt';
if(file_exists($filename)){
echo "$filename was last accessed:".date("Y m d H:i:s.",fileatime($filename));
}
执行以上程序,输出结果为:
test.txt was last accessed:2021 01 20 08:16:42.
2. filemtime()
filemtime()可取得文件修改的时间,成功时返回文件上次被修改的时间,失败时则返回false。时间以UNIX时间戳的方式返回。语法如下:
function filemtime ($filename) false|int
使用示例如下:
<?php
$filename='test.txt';
if(file_exists($filename)){
echo "$filename was last modified:".date("Y m d H:i:s.",filemtime($filename));
}
执行以上程序的输出结果为:
test.txt was last modified:2021 01 20 08:01:05.
3. filesize()
filesize()可获得文件的大小,成功时返回文件大小的字节数,失败时返回false生成一条E_WARNING级的错误。语法如下:
function filesize ($filename) false|int
使用示例如下:
<?php
$filename = 'test.txt';
echo $filename.':'.filesize($filename).'bytes';
执行以上程序的输出结果为:
test.txt:34bytes
4. filetype()
filetype()可获得文件的类型,可能返回的值有fifo、char、dir、block、link、file和unknown。
5. stat()
stat()可给出文件的信息,能返回上次访问、修改时间以及文件大小等各种信息。语法如下:
function stat ($filename) array|false
使用示例如下:
<?php
echo "<pre>";
print_r(stat('1.jpg'));
执行以上程序的输出结果为:
Array ( [0] => 3 [1] => 0 [2] => 33206 [3] => 1 [4] => 0 [5] => 0 [6] => 3 [7] => 258229 [8] => 1611035364 [9] => 1571918824 [10] => 1611035364 [11] => -1 [12] => -1 [dev] => 3 [ino] => 0 [mode] => 33206 [nlink] => 1 [uid] => 0 [gid] => 0 [rdev] => 3 [size] => 258229 [atime] => 1611035364 [mtime] => 1571918824 [ctime] => 1611035364 [blksize] => -1 [blocks] => -1 )
13.2.4 复制/删除/移动/重命名文件
1.复制文件
在PHP中使用copy()函数复制文件,语法如下:
function copy ($source, $dest, $context = null) bool
该函数实现将文件从source复制到dest的功能。执行成功时返回true,失败时返回false。
使用示例如下:
<?php
$file = 'test.txt';
$newfile = 'test.txt.bak';
if(! copy($file,$newfile)){
echo "failed to copy $file..\n";
}else{
echo "copy successfull";
}
执行以上程序后将会复制test.txt文件并重命名为test.txt.bak。如果原来已经存在test.txt.bak,那么该文件将会被覆盖。执行程序后在浏览器中的输出结果为:
copy successfull
2.删除文件
在PHP中使用unlink删除文件,语法如下:
function unlink ($filename, $context = null) bool
filename是要被删除的文件名称,执行成功时返回true,失败时返回false。
使用示例如下:
<?php
$file = 'test.txt.bak';
if(!unlink($file)){
echo "failed to delete $file..\n";
}else {
echo "delete successfuly";
}
执行以上程序后将会删除test.txt.bak文件,并且在浏览器中显示结果:.
delete successfuly
3.移动/重命名文件
rename可重命名一个文件,也可移动文件。语法如下:
function rename ($oldname, $newname, $context = null) bool
<?php
if(rename('test.txt','test.rename.txt')){
echo "success";
}else{
echo "failed";
}
if(rename('test.rename.txt','depth1/depth2/test.txt')){
echo "success";
}else{
echo "failed";
}
oldname是原文件的名字,newname是重命名后的名字。函数执行成功时返回true