• 微信号
目录

php基础

您当前的位置:首页 > 我的笔记 > php基础>php文件操作

php文件操作

在程序开发过程中,经常需要对文件进行操作,如,打开、关闭、创建、删除等等。

打开和关闭文件

在操作硬盘上某个文件时,首先需要打开文件,然后对其进行操作,然后关闭文件。同理在程序中操作文件也是这个步骤,但是程序中打开文件和关闭都是通过函数完成的

1.打开文件

在php中打开文件使用的是fopen()函数,其声明格式如下

resource fopen(string $filename, string $mode[, bool $use_include_path=false [,resource $context]])

$filename表示指定打开的文件;$mode表示打开的模式,可选参数$use_include_path表示是否需要在include_path中搜寻文件,可选参数$context表示上下文,通常用来设置其他的一些协议

在使用fopen()函数时,$filename参数值不仅可以是本地文件,还可以是以http或者ftp开头的网络url地址,而参数$mode指定文件打开模式有很多中常见的模式如下

模式 说明
r 只读方式打开文件,将文件指针指向文件头
r+ 读写方式打开文件,将文件指针指向文件头
w 写入方式打开文焕,将文件指针指向文件头并将文件大小截为0,如果文件不存在则尝试创建文件
w+ 读写方式打开文件,将文件指针指向文件头并将文件大小截为0,如果文件不存在则尝试创建文件
a 写入方式打开文件,将文件指针指向文件末尾,如果文件不存在则尝试创建文件
a+ 读写方式打开文件,将文件指针指向文件末尾,如果文件不存在则尝试创建文件
x 创建并以写入方式打开文件,将文件指针指向文件头,如果文件已存在,则fopen()调用失败并返回false,并生成一条E_WARNING级别的错误信息,如果文件不存在则进行创建文件
x+ 创建并以读写方式打开,其他行为和x模式一样

案例:使用fopen()函数打开文件

<?php
    //以只读的方式打开当前目录的文件
    $file1=fopen("tset.php","r");
    //以写入方式打开文件
    $file2=fopen("E:/phpstudy_pro/WWW/php.com/index.html","w");
    //以只读方式打开远程文件
    $file3=fopen("https://wwww.lingyublog.com","r");
?>

2.关闭文件

在PHP中关闭文件呢使用的是fclose()函数,其声明格式如下:

bool fclose(resource $handle)

fclose()函数只有一个参数,该类型为fopen()函数承购打开文件时返回的文件指针,如果文件关闭承购怎返回true,失败则返回false

案例

<?php
    $file=fopen("E:/phpstudy_pro/WWW/php.com/index.html","r");
    echo "文件打开成功<br>";
    fclose($file);
    echo "文件关闭成功";
?>

运行结果

陵小宇博客-fclose函数关闭文件

文件打开和关闭操作都执行成功了。通过fopen()函数打开文件,并且指定文件的操作模式,然后对文件进行相关操作,最后通过fclose()函数关闭文件

读取文件

在程序开发中,经常需要对文件进行读写操作,为了方便对文件进行读写,php提供了fread()、fgetc()、fgets()、file_get_contents()等函数,这些函数可以以不同形式对文件进行读写

1.fread()函数

fread()函数用于在打开文件时读取指定长度的字符串,其声明格式如下

string fread(resource $handle, int $length)

fread()函数中的$handle参数文件系统指针,$length参数用于指定读取字节长度,该函数在读取指定length个字节数,或读取到文件末尾时就会停止读取文件,返回读取的字符串,如果出现错误则返回false

案例:使用fread()函数读取文件

<?php
    //从文件中读取指定长度字符串
    $filename="E:/phpstudy_pro/WWW/php.com/dome.txt";
    $handle1=fopen("$filename","r");//以只读的方式打开文件
    $content1=fread($handle1,12);//从文件中读取前12个字节
    echo $content1."<br>";
    fclose($handle1);//关闭文件
    echo "<hr>";
    //一次性读取整个文件
    $handle2=fopen($filename,"r");
    $content2=fread($handle2,filesize($filename));
    echo $content2."<br>";
    fclose($handle2);
?>

运行结果

陵小宇博客-fread()函数读取文件

2.fgetc()函数和fgets()函数

fgetc()函数用于在打开文件中地区读取一个字符,其声明格式如下:

string fgetc(resource $handle);

在声明中,$handle参数表示一个文件指针,该函数每次只能读取一个字节,返回一个包含一个字符的字符串,如果遇到文件结束标志EOF时,则返回false

fgets()函数用于在打开的文件中读取一行,其声明格式如下:

string fgets(int $handle [, int $length]);

在声明中,$length是可选参数,指定了读取的字节数。该函数一次至多从打开文件中读取一行内容,碰到切换符、EOF或者已经读取了length-1字节后停止,如果没有指定$length,则默认1024个字节

案例

<?php
    $filename="E:/phpstudy_pro/WWW/php.com/hello.txt";
    $handle1=fopen($filename,"r");
    $contents1=fgetc($handle1);
    echo $contents1."<br>";
    fclose($handle1);
    echo "<hr>";
    $handle2=fopen($filename,"r");
    $contents2=fgets($handle2);
    echo $contents2;
    fclose($handle2);
?>

运行结果

陵小宇博客-fgetc()函数和fgets()函数读取文件

3.file_get_contents()函数

file_get_contents()函数用于将文件的内容全部读取到一个字符串中,其声明格式如下:

string file_get_contents(string $filename [, bool $use_include_path [,resource $context [, int $offset [,ingt $maxlen]]]])

file_get_contents()函数中,$filename指定要读取的文件名,$use_include_path为可选参数,如果想在include_path中搜寻文件的话,可将参数设为1.$context为可选参数,它指定文件指针的上下问,可以用于修改流的行为,若使用null,则忽略。$offset为可选参数,指定在文件中开始读取的位置,默认从文件开头。$maxlen为可选参数,指定读取的最大字节数,默认为整个文件大小

案例

<?php
    $filename="E:/phpstudy_pro/WWW/php.com/hello.txt";
    $contents=file_get_contents($filename);
    echo $contents;
?>

运行结果

陵小宇博客-file_get_contents()函数读取文件

file_get_contents()函数是用来将文件的内容读入到一个字符串的首选方法,如果系统支持还会使用内存映射技术来增强性能

4.file()函数

file()函数作用是将整个文件读入到数组中,如该函数执行成功,则返回一个数组,数组中的每一个元素都是文件中的一行,包括换行符在内。如果执行失败,则返回false。其声明格式如下:

array file(string $filename [, int $use_include_patn[, resource $contxet]])

$filename参数指定了要读取的文件名,也就是说改函数不需要使用fopen()函数打开文件,可选参数$use_include_patn表示是否需要在include_patn中搜索文件,$context表示句柄的环境,若使用null,则忽略

案例

<?php
    //近一个月文件读入数组
    $lines=file('https://www.lingyublog.com/index.html');
    //在数组中循环,显示html的源文件并加上行号
    foreach ($lines as $line_num => $line){
        echo "Line #<b>{$line_num}</b>:".htmlspecialchars($line)."<br/>\n";
    }
?>

运行结果

陵小宇博客-file()函数读取文件

写入文件

当对读取文件进行处理后,通常都会将处理后的结果写入到文件中,在php中提供了fwrite()和file_put_contents()等函数用于将数据写入到文件的操作。

1.fwrite()函数

fwrie()函数用于写入文件,其声明格式如下:

int fwrite(resource $handle , string $string[, iny $length])

在声明中,参数$handle表示fonpe()函数返回的文件指针,参数$string表示写入的字符串。参数$length为可选参数,指定写入的字节数,如果指定了$length,则写入指定$length长度的字节,如果省略,则写入整个字符串。

案例:

<?php
    $filename="text.txt";
    $content="你好,朋友,很高兴认识您!\n";
    $handle=fopen($filename,'w');//打开文件
    fwrite($handle,$content);//向文件写入数据
    fclose($handle);
    echo "文件写入成功";
?>

运行结果

陵小宇博客-fwrite()函数写入文件

ferite()函数,如果写入文件不存在,则在根目录下创建该文件。

2.file_put_contents()函数

file_put_contents()函数函数也可以用于对文件进行写入惭怍,而且不需要使用fopen()函数打开文化,其声明格式如下:

int file_put_contents(string $filename ,mixed $data [, int $flage [, resource $context]])

在声明中,参数$filename表示指定写入的文文件,参数$data表示指定要写入的内容。可选参数$fagle表示指定写入的特性,如,FILE_USE_INCLUDE_PATH表示一个资源,该函数在include目录里搜索file name, FILE_APPEND表示追加写入,参数$context表示一个资源,该函数表示一个资源,该函数执行成功附返回写入到文件内数据的字段输,失败则返回false

案例

<?php
    $filename="text.txt";
    $contents="你叫什么名字?";
    file_put_contents($filename,$contents,FILE_APPEND);//以追加的方式写入
    echo "写入成功";
?>

运行结果

陵小宇博客-file_put_contents()函数写入文件

需要注意的是file_put_contents()函数和依次调用fonpe()、fwite()、fclose()三个函数的功能是一样的。

文件加锁机制

web应用程序上线之后面临的一个普遍的问题就是并发访问。这对文件操作尤为明显。如果多个浏览器在同一时刻访问服务器上的某一个文件,这意味着不同的访问精神会同一时刻读写同一个文件。很有可能造成数据的紊乱或者文件的损坏。为了避免这个问题.php中提供了文件加锁机制,这种机制通过flocK()函数来实现,其声明格式如下:

bool flock(resource $handle ,int $operation [, & $woulbdlock])

flock()函数中$handle参数表示文件系统指针,$operation指定了使用哪种锁类型,$woulbdlock为可选参数,如设置为1或true,则当进行锁定时阻挡其他进程

需要注意的是,floc()函数的$operation参数有多个值,具体如下

  • LOCK_SH:取得共享锁定(读取文件时使用)
  • LOCK_EX:取得独占锁定(写文件时使用)
  • LOCK_UN:释放锁定(无论共享或独占,都用它释放)
  • LOCK_NB:如果不希望flock()在锁定时堵塞,则给operartion加上LOCK_NB.

当一个用户进程在访问文件加上锁,其他用户进程想要对该文件进行访问,就必须等到锁定被锁定释放。这样就可以避免在并发访问同一个文件时破坏数据

案例

<?php
    $fp=fopen("flock.txt","w+");
    if(flock($fp,LOCK_EX)){ //取得独占锁定
        fwrite($fp,"文件已锁定");
        flock($fp,LOCK_UN);//释放锁定
    }else{
        echo "文件不能被锁定";
    }
    fclose($fp);
?>

运行结果

陵小宇博客-文件加锁机制

需要注意的是,由于flock()需要一个文件指针,所以不得不用一个特殊的锁定文件来霸服打算通过写模式打开文件的访问(在floce()函数中加入“w+”或“w”)

其他操作

除了需要对文件有读写操作外,还有其他操作,如,复制、删除和重命名等。为此php提供了copy()函数、rename()函数和unlink()函数等

1.复制文件copy()函数

copy()函数用于实现拷贝文件功能,其声明格式如下:

bool copy(string $source , string $dest)

在声明中,参数$source表示指定源文件,参数$dest表示指定目标文件,但文件复制成功时返回true,失败时返回值为false

案例:copy()函数的使用

<?php
    $file="E:/phpstudy_pro/WWW/php.com/text.txt";
    $newfile="E:/phpstudy_pro/WWW/php.com/copy/newtext.txt";
    if(!copy($file,$newfile)){
        echo "文件复制失败!";
    }else{
        echo "文件拷贝成功";
    }
?>

运行结果

陵小宇博客-复制文件copy()函数

需要注意的是,在使用copy()函数进行复制时,如果文件已经存在,则被覆盖

2.重命名文件rename()函数

rename()函数用于实现文件或目录重命名,其声明格式如下:

bool rename(string $oldname, string $newname [,resource $context])

在声明中,变量$oldname表示源文件的名称,变量$newname表示新的文件名称。如该函数执行成功则返回true,失败则返回false

案例1

<?php
    $file="text.txt";
    rename($file,"newtext.bat");
    echo "文件命名成功";
?>

运行结果

陵小宇博客-重命名文件rename()函数

案例2

<?php
    $file="text.txt";
    rename($file,"E:/phpstudy_pro/WWW/php.com/rename2/renam.txt");
    echo "文件重命名并指定新的位置";
?>

运行结果

陵小宇博客-重命名文件rename()函数

需要注意的是,在使用rename()函数时,如果两个文件在同一个目录下,则是重命名操作,如果靓仔文件在不同目录下,则为移动操作

3.删除文件unlink()函数

unlink()函数作用是删除文件,其声明格式如下:

bool unlink(string $filename)

在声明中,参数$filename表示文件名或文件路径,如果删除成功返回值为true,失败则返回false

案例

<?php
    $file="E:\phpstudy_pro\WWW\php.com\unlink/test.html";
    unlink($file);
    echo "删除成功";
?>