PHP 的 fopen()函数
打开文件操作:
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
可以看到,函数返回的是一个资源句柄(resource handle),类似与C中的文件指针,读和写都从文件的指针处开始。
$filename是文件的路径,可以使用绝对路径和相对路径。
$mode是打开文件的模式,也就是文章的重点。
$use_include_path 规定是否搜索指定的包含路径。
$context是上下文选项。
后面两个可以不用管,主要是mode参数。mode是告诉计算机对文件的访问操作及权限设置。在操作手册中可以看到:
mode | 说明 |
---|---|
'r' | 只读方式打开,将文件指针指向文件头。 |
'r+' | 读写方式打开,将文件指针指向文件头。 |
'w' | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
'w+' | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
'a' | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
'a+' | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
'x' | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE ,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。 |
'x+' | 创建并以读写方式打开,其他的行为和 'x' 一样。 |
在学C的时候,就对文件操作存在恐惧感和抵触情绪,当时觉得对数据库的操作才是王道,更何况有这么多文件的mode.....
后来看了神作《Unix编程思想》,才知道 文本 才是数据表示的精髓......废话不多说,我们用比较的方法来方便记住:
r类(表示r和r+,下同):主打读(read)操作。文件若存在,指针指向文件头,文件不存在则返回false。
w类:主打写(write)操作。文件若存在,清空文件,指针指向文件头,文件不存在则创建文件。
a类:主打添加(append)操作。指针指向文件尾,文件不存在则创建文件。
x类:谨慎写操作。与w类类似,但文件若存在则返回false。
现在能清晰点了,通过例子来看看几个易混的模式:
同为读写的r+、w+、a+、x+:
/* *例如存在文件article.txt,内容如下: 'Always be thankful!. We all have so much thankful for.' */ $file = fopen($_SERVER['DOCUMENT_ROOT'].'/learn/document/article.txt', 'mode') or exit('Unable to open file'); $output = 'something new.'; fwrite($file,$output); fclose($file);
若mode为‘rb+’,那么文件被改为:
'Something new.kful!. We all have so much thankful for.'
若mode为‘wb+’,那么文件被改为:
'Something new.'
若mode为‘ab+’,那么文件被改为:
Always be thankful!We all have so much thankful for. something new.
若mode为‘xb+’,那么显示错误:
Unable to open file 并停止脚本。
另外,还有一个c模式,可不用记住了。
操作文件还有b(二进制)和t(文本)模式,t模式可以转换一些\t \n类的标记符号,但如果要打开图片等二进制文件,或者保证code的移植性,建议指定b模式。
最后说一下换行符,这得追溯到电传打字机的历史,有兴趣的可以百度。
在原始的表示里,/n表示newline,即光标向下移动一行,左右位置不动;而/r表示return,即光标回到行首。按理说,正常的换行应该是/n/t,但在unix系统里换行用 /n 来代替,windows则用 /r/n ,而在mac中用 /r 。这样,不同的文本在不同的系统里表现也大相径庭,给代码带来不少的麻烦。
PHP为我们考虑了这个问题,通过引入一个常量PHP_EOL(PHP_End Of Line,好记吧!),就可让PHP自动在不同的平台下选择相应的换行符,大大加强了代码的可移植性。
OK,打完收工。