PHP文件操作 读取与写入
基本知识:
PHP文件系统是基于Unix系统的
文件数据基本类型:二进制数据、文本数据
文件输入流:数据从源文件到内存的流动
文件输出流:数据从内存保存到文件的流动
文件操作函数:
》》》读《《《
==>获取文件流
fopen(文件相对路径/绝对路径,[文件打开模式]); 成功返回文件流,否则返回false
[文件打开模式]六种常用打开方式:
r 只读方式打开 指针在文件头
r+ 读写方式打开 指针在文件头
a 写入方式打开[追加] 指针在文件尾
a+ 读写方式打开[追加] 指针在文件尾
w 写入方式打开[创建或清空] 指针在文件头
w+ 读写方式打开[创建或清空] 指针在文件头
b 只限于windows,二进制模式,附加在其他模式的上,例如”xb”
t 只限于windows,附加在其他模式上,,将所有行的结束符转换成\r\n
==>根据文件流获取文件信息
fstat(文件流); 返回文件信息
返回的数组部分信息:
[\’size\’]:文件大小
[\’atime\’]:最后访问时间 返回的是Unix时间戳 转换date(\’Y-m-d H:i:s\’,$fileStream[\’mtime\’]);
[\’mtime\’]:最后修改时间
[\’ctime\’]:最后改变时间(相当于创建时间,只要所有者或用户组没有变化)
==>关闭文件
fclose($fileStream);
==>根据路径获取文件信息(方法二):可以不用打开文件就可以获取文件信息
filesize($filePath);
fileatime($filePath);
filemtime($filePath);
filectime($filePath);
==>判断文件是否存在
file_exists($filePath);
==>读取文件内容(方法一)
$fileData = fread($fileStream,filesize($filePath));
注意:
文本文件读取到网页上显示时,由于换行符不被解释,文本不换行显示,
解决办法:将\r\n替换为<br/>[str_replace(\’\r\n\’,\'<br/>\’,$fileData);]
==>读取文件内容(方法二)
file_get_contents($filePath); 将整个文件读取到一个字符串(内部自动关闭文件流)
==>读取文件内容(方法三) 循环读取,用于读取大文件
循环读取指定字节大小的文件数据
feof($fileStream):判断文件指针是否在文件未尾,是返回true,否则返回false
while(!feof($fileStream)){
$fileData = fread($fileStream,1024);
echo $fileData;
}
应用扩展:
编写配置文本文件 db.ini
内容:
host=172.0.0.1
uid=root
pwd=1314
dbname=test
parse_ini_file(\’db.ini\’); 根据‘=’分隔后的一个数组
======================================
fopen(\’htttp://demo.php/\’,\’r\’);
可以读取远程文件,但只限于只读模式
成功返回文件流,否则返回false
fread($handle,$len); 读取文件的len个字符长度可
stream_get_contents($handle); 读取文件所有内容
fwrite(fileStream,rContent,[length])
Note: 在区分二进制文件和文本文件的系统上(如 Windows) 打开文件时,fopen() 函数的 mode 参数要加上 \’b\’。
成功返回写入的字符数,出现错误时则返回 FALSE 。
fclose(fileStream)
例:
$filename = “/usr/local/something.txt”;
$handle = fopen($filename, “rb”);
$contents = fread($handle, filesize ($filename));
fclose($handle);
ftruncate($hanle,$len); 截取文件内容
》》》写《《《
==>写入文件(方法一)
$fileStream = fopen(filePath,”a+”); 给文件末尾追加内容用a+
fwrite($fileStream,”要写入的内容”); 返回写入的字符数,出现错误时则返回 FALSE 。
==>写入文件(方法二)
file_put_contents($filePath,”要写入的内容”,FILE_APPEND);
内部会自动关闭文件流,FILE_APPEND以追加方式添加,如果没有则默认是对内容清空再写入
如果是循环写入,效率没有第一种高
》》》拷贝《《《
copy(源路径,结果路径);
注意:中文的编码转换 iconv(\’utf-8\’,\’gb2312\’,$filePath);