PHP文件系统(一)简单的函数解析

发布于 2022-11-26  1106 次阅读


内容纲要

作为一门服务端的编程语言,php自然是对服务器的文件系统提供了操作支持,一个完整的网站项目,经常会用到文件系统的方法,本文对文件系统进行详细的介绍。

file_get_contents与file_put_contents()

这两个函数是最简单的文件操作函数,实际上他们不仅可以用于本地文件操作,也可以操作远程文件,获取网页内容最基本的操作方法就是利用file_get_content(),他的作用是获取某个文件的内容,返回的内容是一个字符串,即文件的内容。

file_get_contents()

file_get_contents(path,include_path,content,start,length);

  • path 读取文件的路径
  • include_path 如果需要在php.ini中搜索文件,将这个参数设为1
  • content 规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。
  • start 规定文件读取开始的位置,默认为0即从开头开始读取
  • length 规定读取文件内容的长度,默认为所有内容。

除了第一个参数path以外,其他四个参数都是可选的,并且很少使用,这里只对其进行简单的演示:

$str=file_get_contents("demo.txt"); 
//读取当前脚本同级目录下的demo.txt文件 $str=file_get_contents("demo.txt",1,NULL,10,100)
 //读取demo.txt文件,并且从第11个字符开始读取,只读取100个字符。

file_put_contents()

file_put_contents(path,data,mode,content)

file_put_contents()是对文件进行写入操作,参数的解释:

  • path 要写入文件的路径,如果该文件不存在则创建此文件,例如在修改demo/demo.txt的文件内容,但是demo目录下没有demo.txt,就会创建这个文件。
  • data 写入的数据
  • mode 规定如何打开或写入文件,有三种可能的值:

1.FILE_USE_INCLUDE_PATH:

如果设置了 FILE_USE_INCLUDE_PATH,那么将检查 *filename* 副本的内置路径

2.FILE_APPEND:

默认情况下,写入任何内容都会直接替换此文件内容,如果mode设置为FILE_APPEND,就会在不改动原有的内容的基础上在文件的内容末尾插入要写入的数据。

3.LOCK_EX

设置此参数,在写入之后会锁定该文件。

文件处理系统

上面两种方法是简单的修改单个文件的方法,实际上php提供了非常强大的文件系统支持!文件处理系统将文件处理系统化,过程化,并且提供了非常多的操作方法,它可以像你在windows窗口内操作文件一样。

fopen()

对一个文件进行操作,首先要打开一个文件,fopen()函数就是打开文件的函数,他类似于你在电脑上用记事本打开一个文件,当你通过fopen打开一个文件后,此函数会返回一个文件资源的句柄,它就类似于你在电脑上打开文件的窗口,一个窗口对应一个文件,接下来所有对此文件的操作都是通过这个句柄(窗口)

fopen(path,mode)

  • path 打开文件的路径,可以是本地文件,也可以是远程文件,当打开远程文件时,需要确保该文件允许被访问。
  • mode 打开文件的模式。
  • r 以只读模式打开,即只能读取文件内容,无法通过fwrite等函数操作文件,相当于在电脑上打开只有阅读权限的文件,文件指针指向文件头
  • r+ 读写模式打开,允许阅读和改动文件,相当于在电脑上打开自己创建的有编辑权限的文件。文件指向文件头。
  • w 只写模式打开,清除文件内容,如果文件不存在则创建此文件。
  • w+ 读写模式打开,清除文件内容,如果这个文件不存在则创建之。
  • a 写入模式打开,a即append的首字母,通过这个模式打开文件,文件指针指向文件末尾,写入的文件会在文件末尾插入,不影响原有内容。如果文件不存在则创建之。
  • a+ 读写模式打开,文件指针指向文件末尾。
  • x 创建一个文件并且以写入的方式打开,如果文件已存在,则返回false并且生成一个错误。
  • x+ 创建一个文件并且以读写模式打开,如果文件已经存在,则返回false并报错。

什么是文件指针?

文件指针大概就是你在电脑上打开文件时的鼠标指针,比如你要阅读文件,阅读的应该是鼠标指针指向的那一行,如果你要编辑文件,肯定编辑的也是鼠标指针的那一行。比如通过fopen指向尾行,即a模式的默认指向,这时候如果用fwrite写入,会在文件末尾写入,就像是你把鼠标指针放在文件窗口的最后一行,然后点击编辑。

什么是只读/只写/读写的区别?

只读就是只读取文件,不可对文件进行修改,只写就是只写入文件,不能获取文件的内容,就是你看不见屏幕上有什么,只能通过键盘往文件里塞东西,读写就是即可以获取文件内容,也可以修改文件内容。

例如:

$file=fopen('test.txt','w+')

通过w+模式打开test.txt,即读写模式,如果test.txt这个文件里有内容,就会被清空,然后重写,如果不存在test.txt,就会创建这个文件。

打开文件是为了对文件进行操作,当你双击一个文件在窗口打开以后,或是阅读它的内容,或是编辑它的内容,首先我们介绍如何阅读文件内容?

2.fread()函数

fread就是读取文件的函数,把它想象成你的目光,你可以控制你的目光能够看到多少内容。

fread(content,length)

  • content 通过fopen返回的文件指针,fread能否阅读文件受文件指针的影响,如果fopen打开文件的模式是w或者a,fread将无法读取文件,会产生一个错误。
  • length 读取内容的字节数,注意单位是字节而不是字符,一个中文在UTF-8编码中占据三个字节,所以如果这个值是三,你就只能看到一个中文字符。

例:

$f=fopen('aaa.txt','r'); $txt=fread($f,100);

从aaa.txt中在首行开始读取100个字符的内容。

fread()中第二个参数读取内容的长度是必须的,因此如果你不能确定文件含有多少内容仅仅使用fread 函数是很难读取所有内容的。

但是我们可以配合filesize()函数来读取整个文件内容。

3.filesize()

filesize()是函数的功能是判断某个文件的大小,单位也是字节,而fread也是通过字节作为单位来读取文件内容的,所以通过filesize计算的文件大小,其实也就是整个文件内包含的字符的长度。

filesize($path);

参数path是文件路径,注意不是文件指针吗,而是路径!

例:通过filesize()与fread配合读取文件全部内容:

$path="test.txt";
//文件路径
$len=filesize($path);
//文件大小
$file=fopen($path,"w+");
//打开文件,生成指针
$str=fread($file,$len);
//读取文件,$str即文件内所有的内容

如果我们打开一个文件,阅读可能不止是目的,我们还要修改文件,这时候应该如何做呢?我们可以使用fwrite()函数来向文件内写入内容。

4.fwrite()

fwrite($path,$data[,$length]);

  • $path 即通过fopen打开的文件的指针
  • $data 即要写入的数据·
  • $length 可选。要写入的字符的长度

fwrite能否写入受fopen打开文件方式的影响,如果打开方式是r则不可写入,如果是x或x+但是文件已存在同样不可写入(并且此时会报错)

fwrite写入的位置也是受fopen影响的,如果fopen打开是w,则fwrite()写入时会清空文件内容,写入新数据,但是!很重要的一点,如果fwrite写入两次或者多次,后面的写入会在文件末尾插入数据,而不是清空!因为清空文件的操作是在fopen时就已经实现的,并且fwrite写入一次后会将文件指针下移一行!

例:

$f=fopen("demo.txt","w+"); fwrite($f,"abc");
fwrite($f,"def");
//最后的结果是abcdef而不是def!

如果在上面的代码接着运行以下代码:

$f=fopen("demo.txt","w+");
fwrite($f,"666");
//最后文件只剩下了666

给出一个需要注意的例子:如果第三个参数设置了,一定要注意字节长度!

$f=fopen("demo.txt","w"); 
fwrite($f,"世界,你好",1);

以上例子,写入内容会是一个乱码�!上面已经提出了,在UTF-8编码中一个中文占据3个字节,所以如果你只写入一个字节,是不能截取到对应的字符的,这时候要根据你写入的中文字符数量来计算,以utf-8为例,一个中文占据三个字节,所以如果要写入一个中文字符需要长度为3,请注意,中文符号也占据三个字符,并且某些生僻字占据四个字符。

所以上面的例子如果要写入世界两个字需要设置长度为6:

$f=fopen("demo.txt","w");
fwrite($f,"世界,你好",6);

值得注意的是,PHP的文件系统没有提供删除文件内容的方法,但是我们可以通过将文件读取为数组的方法来实现删除文件内容。

例:

function delline($file,$line){
    //@paragram int $line 删除的行数
    //@paragram string $line 删除多行行数组成的数组
    //@paragram string $file 文件路径
    $f=file_exists($file);
    //文件指针
    if($f==false){
        die("文件打开出错");
    }
    $arr=file($file);
    //将文件逐行读取为数组
    if(is_integer($line)){
        unset($arr[$line]);   
    }else if(is_array($line)){
        foreach($line as $v){
         unset($arr[$v]);           
        }
    }else{
        die("line参数错误!");    
    }
    //将删除后的文件写入
    $path=fopen($file,"w+");
    foreach($arr as $v){
        fwrite($path,$v);            
    }
    fclose($path);
    echo "删除成功!";
}

此例中使用到的新函数:

  • file_exits($path) 判断文件是否存在,如果存在返回true,不存在返回false,$path 为文件路径而不是指针
  • file($path) 将文件内容分割为数组,每一行对应一个键值对,键为行数,值为每行的内容。$path为文件路径。
  • is_integer 判断变量是否为整型
  • is_string 判断变量是否为字符串

5.fclose($path)

上面的例子在最后用到了fclose(),这个函数用来关闭已经打开文件和清除指针,就像我们在电脑上打开文件,编辑完成之后需要关闭窗口和进程来释放内存一样,fclose是可以关闭打开的文件,取消占用并且释放文件指针变量。

————————本章完————————