##文件操作的常量 下面这一个常量是最常用的。是文件目录的分割符的常量。 我们来看看格式: | 平台 | 分割符 | | -- | -- | | windows | \ | | linux | / | windows 的路径格式为 d:\xxx\xxx 注意:windows支持 d:/xxx/xxx linux 的路径格式为 /home/xxx/xxx 注意:如果\home\xxx\xxx 在linux上是错误的 所以当你开启转义之类的话,转义字符 \ 用一起的话 d:\xxx\xxx 是一样的。判断时候有两个 \ 有的话 再转成一个\ 再把 \ 替换成 /当路径分割,这样在linux上或者windos上的路径就能保持统一了。 我们会使用到一个常量: **DIRECTORY_SEPARATOR** 我们来写一个小的实例,定义当前文件所在的路径: 由于__FILE__是PHP的预定义常量,所以没办法改变,如果需要让__FILE__也自适应操作系统。 那么就是不要用__FILE__,可以用自定义的常量,并且把__FILE__处理一下,如下: ~~~ <?php $_current_file = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, __FILE__); define('__CUR_FILE__', $_current_file); echo __CUR_FILE__; ?> ~~~ ##文件指针操作函数 > rewind ( resource handle) 功能:指针回到开始处 > fseek ( resource handle, int offset [, int from_where]) 功能:文件指针向后移动指定字符 我们在之前的读取当中我们发现fread读取指定长度的数据。读取指定长度的内容,下次再读取的时候从原位置开始再接着向后读取。 ![document/2015-09-08/55eecf3c2a7e0](http://box.kancloud.cn/document_2015-09-08_55eecf3c2a7e0.png) 如上图,我们可以想象: 1. 文件刚打开的时候读取到的是红色的图标 2. 文件假设从A读取到了C 3. 下次打开的时候可再从C绿色箭头处开始读取。 我们在demo.txt文件中写入一批文件: > abcdeefghijklk > opqrst > uvwxyz > 12345678 我们可开始来实验一次。 ~~~ <?php $fp = fopen('output.txt', 'r+'); //读取10个字符 echo fread($fp,10); //指针设置回到开始处 rewind($handle); //再读取10次看看输出的是什么 echo fread($fp,10); //文件指针向后移动10个字符 echo fseek($fp,10); //再看看文件中输出的是什么 echo fread($fp,10); fclose($handle); ?> ~~~ 上面的例子,你会发现fseek指定多长就移动多少个字节。而rewind每次都是回到文件的开始处。 那如何移动到最末尾呢?我们可以统计字节数。在fseek的时候直接移到回后。 下面我们来讲filesize统计字节数。 ##filesize 检测文件的大小 ~~~ <?php $filename = 'demo.txt'; echo $filename . '文件大小为: ' . filesize($filename) . ' bytes'; ?> ~~~ ##其它操作文件的函数 其实还有一些其他操作文件的函数,读取文件 | 函数名 | 功能 | | -- | -- | | file | 把整个文件读入一个数组中 | | fgets | 从文件指针中读取一行,读到最后返回false | | fgetc | 从文件指针中读取一个字符,读到最后返回false | | ftruncate | 将文件截断到给定的长度 | 我们通过一个实例来把上面几个函数都用到。 我们在demo.txt文件中写入一批文件: > abcdeefghijklk > opqrst > uvwxyz > 12345678 ~~~ <?php //以增加的r模式打开 $fp = fopen('demo.txt','r+'); //你分发现每次只读一个字符 echo fgetc($fp); //我要全部读取可以,读取一次将结果赋值一次给$string while($string = fgetc($fp)){ echo $string; } ?> ~~~ fgets每次打开一行: ~~~ <?php //以增加的r模式打开 $fp = fopen('demo.txt','r+'); //你分发现每次只读一个字符 echo fgets($fp); echo fgets($fp); echo fgets($fp); echo fgets($fp); ?> ~~~ 上面的代码,你会发现每次读取一次打开一行。读取最后返回的是false。 我们接下来看文件截取函数: ~~~ <?php //打开我们上面的demo.txt文件 $file = fopen("demo.txt", "a+"); //你可以数数20个字有多长,看看是不是达到效果了 echo ftruncate($file,20); fclose($file); ?> ~~~ 上例中我们发现,截取多长就能显示多长的内容。 ###文件的时间函数 | 函数 | 功能说明 | | -- | -- | | filectime | 文件创建时间 | | filemtime | 文件修改时间 | |fileatime |文件上次访问时间 | ~~~ <?php $filename = 'demo.txt'; if (file_exists($filename)) { echo "$filename文件的上次访问时间是: " . date("Y-m-d H:i:s", fileatime($filename)); echo "$filename文件的创建时间是: " . date("Y-m-d H:i:s", filectime($filename)); echo "$filename文件的修改时间是: " . date("Y-m-d H:i:s", filemtime($filename)); } ?> ~~~