PHP文件处理

PHP 拥有的多种函数可供创建、读取、上传以及编辑文件。

注意:请谨慎操作文件!

当您操作文件时必须非常小心。如果您操作失误,可能会造成非常严重的破坏。

常见的错误是:

  1.编辑错误的文件

  2.被垃圾数据填满硬盘

  3. 意外删除文件内容


PHP readfile()函数

readfile($文件名) 

功能:传入一个文件路径,输出一个文件


例如 有个名为file.txt 的文件,内容如下

  Welcome in the PHP Chinese learning PHP

 用readfile()函数读取此文件并写到输出流的 PHP 代码如下(如读取成功则 readfile() 函数返回字节数):

 字节数:英文占一个字节  gbk编码中文占2个  utf-8中文占3个  空格和符号占1个

<?php
echo readfile("D:WWW/item/file.txt");
?>

程序运行结果:

Welcome in the PHP Chinese learning PHP39


file_get_contents打开文件

上面的是单纯打文件就直接输出了,有没有打开文件后,能够赋值给一个变量的操作方式呢。

PHP当然会提供这种方式。这个方式就是PHP打开文件并返回内容的方式之一,我们来看看函数:


file_get_contents ( string filename)

功能:传入一个文件或文件路径,打开这个文件返回文件的内容。文件的内容是一个字符串。

例如  有个file.txt 的文件,内容如下:

 I use the file_get_contents open

使用 file_get_contents 打开

<?php
$fileName="file.txt";
$filestring = file_get_contents($fileName);
echo $filestring;
?>

程序运行结果:

 I use the file_get_contents open

 


fopen、fread、fclose操作读取文件

fopen ($文件名, 模式)

fread ($操作资源, 读取长度)

fclose ($操作资源 )

通过上面的函数我们来讲解资源类型的通常操作方式:

1.  打开资源

2.  使用相关函数进行操作

3.  关闭资源

fopen函数 fopen函数的功能是打开文件,参数主要有两个:

1.  文件打开的路径

2.  打开文件的模式
     资源类型需要其他的函数来操作这个资源。所有的资源有打开就要有关闭。

fread函数 函数的功能的功能是读取打开的文件资源。读取指定长度的文件资源,读取一部份向后移动一部份。至到文件结尾。

fclose函数 fclose函数的功能是关闭资源。资源有打开就有关闭。

 fopen的模式(下表):

         模式          说明
  r只读。在文件的开头开始。
  r+读/写。在文件的开头开始。


  w

只写。打开并清空文件的内容;如果文件不存在,则创建新文件。

    

  w+

读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。

     

  a

追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。
  a+读/追加。通过向文件末尾写内容,来保持文件内容。

   

  x

只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。

  

  x+

读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
  twindows下将\n转为\r\n
     b二进制打开模式

1.打开文件

file.txt 文件的内容如下

You're welcome

<?php
//你可以创建一个file.txt,以只读模式打开
$fp = fopen('file.txt', "r");
//var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource
var_dump($fp);
?>

2.读取文件

<?php
$fp = fopen('file.txt', "r");
//打开一个文件类型后,读取12个字节
$contents = fread($fp, 12);
?>

 3,关闭文件

<?php
$fp = fopen('file.txt', 'r');
$contents = fread($fp, 1024);
fclose($fp);
echo $contents;
?>

程序运行结果:

 You're welcome


file_put_contents和fwrite写入文件

  file_put_contents ( string $文件路径, string $写入数据])

 功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度


实例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$data = "我是一个兵,来自老百姓";
$numbytes = file_put_contents('binggege.txt', $data);
if($numbytes){
    echo '写入成功,我们读取看看结果试试:';
    echo file_get_contents('binggege.txt');
}else{
    echo '写入失败或者没有权限,注意检查';
}
?>

程序运行结果:

 写入成功,我们读取看看结果试试:我是一个兵,来自老百姓


fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])

   :fwrite的别名函数是fputs

我们上面试了r模式,只道是读取的时候使用,接下来我们用fwrite加上fopen中的w,写入模式来进行文件写入

实例

你可以试试新建个test.txt文件向里面写入内容。然后,可以试试把test.txt删除。看看有什么提示。

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'test.txt';
$fp= fopen($filename, "w");
$len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
fclose($fp);
print $len ."字节被写入了\n";
?>

程序运行结果:

66字节被写入了

总结:
1.不论有没有新建都会打开文件重新写入
2.原有的文件内容会被覆盖掉
3.文件不存在会创建


对比一下以下几个模式的不同:

  模式  说明
  r只能读不能使用fwrite写
  r+可操作读、写
  w只可以写功能
  w+

即可读又可以写


实例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'test.txt';
$fp= fopen($filename, "r");
$len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
fclose($fp);
print $len .'字节被写入了\n';
?>

程序运行结果:

 0字节被写入了\n

我们发现只用 r 的话 写入是不成功的


创建临时文件

我们之前创建的文件都是永久文件。

而创建临时文件在我们平时的项目开发中也非常有用。创建临时文件的几个好处

1.    用完后即删除

2.    不需要去维护这个文件的删除状态

例如:我需要把A的文件内容转存B里面,把B的文件内容转存到C里面。

就跟现实生活中一样,我可以先用一个临时的瓶子把B的水装起来,然后把A的数据写入到B里面。把临时瓶子的水追加到C里面。

我们来学习一下这个函数:

resource tmpfile ( )

功能:创建一个临时文件,返回资源类型。关闭文件即被删除。

实例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$handle = tmpfile();
//向里面写入了数据
$numbytes = fwrite($handle, '写入临时文件的内容');
//关闭临时文件,文件即被删除
fclose($handle);
echo  '向临时文件中写入了'.$numbytes . '个字节';
?>

程序运行结果:

向临时文件中写入了27个字节


移动,拷贝,删除文件

重命名文件

rename($旧名,$新名);

这个函数返回一个bool值,将旧的名字改为新的名字。

实例

<?php
$fileName1="text.txt";
$fileName2="text--1.txt";
rename($fileName1,$fileName2);
?>

上面的例子就是将一个text.txt的文件 改名为text--1.txt 的例子,你不妨可以试下


复制文件

 copy(源文件,目标文件)

功能:将指定路径的源文件,复制一份到目标文件的位置。

实例

<?php
$filename = 'file.txt';  //旧文件名
$filename2 = 'copy-file.txt';  //新文件名
copy($filename, $filename2);    //修改名字。
?>

上面的例子是将一个文件名为 file.txt的文件,复制一份名为 copy-file.txt 的文件,内容一样。


删除文件

 unlink (指定路径的文件)

实例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'test.txt';
unlink($filename);
?>

上面的例子是将一个文件名为 test.txt的文件删除


文件常用的函数

filesize 检测文件的大小

实例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'file.txt';
echo $filename . '文件大小为: ' . filesize($filename) . ' bytes';
?>

程序运行结果:

file.txt文件大小为: 14 bytes

其他操作文件的函数,读取文件

  函数名  功能
  file把整个文件读入一个数组中
  fgets从文件指针中读取一行,读到最后返回false
  fgetc从文件指针中读取一个字符,读到最后返回false
  ftruncate将文件截断到给定的长度


我们通过一个实例来把上面几个函数都用到。

我们在text.txt文件中写入一批文件:

abcdeefghijklk
opqrst
uvwxyz
12345678

fgetc每次读取一个

<?php
//以增加的r模式打开
$fp = fopen('text.txt','r+');
//你分发现每次只读一个字符
echo  fgetc($fp) ."<br>";
//我要全部读取可以,读取一次将结果赋值一次给$string
while($string = fgetc($fp)){
    echo $string;
}
?>

程序运行结果:

 a
bcdeefghijklk opqrst uvwxyz 12345678

fgets每次打开一行:

<?php
//以增加的r模式打开
$fp = fopen('text.txt','r+');
//你分发现每次只读一个字符
echo  fgets($fp)."<br>";
echo  fgets($fp)."<br>";
echo  fgets($fp)."<br>";
echo  fgets($fp);
?>

程序运行结果:

abcdeefghijklk
opqrst
uvwxyz
12345678


文件截取函数

<?php
//打开我们上面的text.txt文件
$file = fopen("text.txt", "a+");
//你可以数数20个字有多长,看看是不是达到效果了
echo ftruncate($file,10);
fclose($file);
?>

运行一下程序,可以打开text.txt 文件,看一下是不是有20的字节


文件的时间函数

    函数   功能说明
    filectime  文件创建时间
    filemtime  文件修改时间
    fileatime  文件上次访问时间

实例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'text.txt';

if (file_exists($filename)) {
    echo "$filename"."文件的上次访问时间是: " . date("Y-m-d H:i:s", fileatime($filename))."<br>";

    echo "$filename"."文件的创建时间是: " . date("Y-m-d H:i:s", filectime($filename))."<br>";

    echo "$filename"."文件的修改时间是: " . date("Y-m-d H:i:s", filemtime($filename));
}

?>

程序运行结果:

text.txt文件的上次访问时间是: 2016-09-13 17:44:40
text.txt文件的创建时间是: 2016-09-13 17:32:16
text.txt文件的修改时间是: 2016-09-13 17:44:55


目录处理函数

之前我们处理的全都是文件,那目录和文件夹怎么处理呢?

我们就来学习目录或者称为文件夹的处理相关函数。

处理文件夹的基本思想如下:

1.    读取某个路径的时候判断是否是文件夹

2.    是文件夹的话,打开指定文件夹,返回文件目录的资源变量

3.    使用readdir读取一次目录中的文件,目录指针向后偏移一次

4.    使用readdir读取到最后,没有可读的文件返回false

5.    关闭文件目录

我们来学习一下比较常用函数:


      函数名       功能
  opendir打开文件夹,返回操作资源
  readdir读取文件夹资源
  is_dir判断是否是文件夹
  closedir关闭文件夹操作资源
  filetype显示是文件夹还是文件,文件显示file,文件夹显示dir


实例

<?php
//设置打开的目录是D盘
$dir = "D:/";
//判断是否是文件夹,是文件夹
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        //读取一次向后移动一次文件夹指针
        echo readdir($dh).'<br />';
        echo readdir($dh).'<br />';
        echo readdir($dh).'<br />';
        echo readdir($dh).'<br />';
        echo readdir($dh).'<br />';
        echo readdir($dh).'<br />';
        //读取到最后返回false
        //关闭文件夹资源
        closedir($dh);
    }
}
?>

可以运行一下程序,看看是不是你电脑D盘的目录


判断文件的类型

<?php
//设置打开的目录是D盘
$dir = "D:/";
//判断是否是文件夹,是文件夹
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        //读取到最后返回false,停止循环
        while (($file = readdir($dh)) !== false) {
            echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />";
        }
        closedir($dh);
    }
}
?>

运行程序看看


文件路径函数

我们经常会遇到处理文件路径的情况。

例如:

1.    文件后缀需要取出来

2.    路径需要取出名字不取目录

3.    只需要取出路径名中的目录路径

4.    或者把网址中的各个部份进行解析取得独立值

5.    甚至是自己组成一个url出来

很多地方都需要用路径处理类的函数。

我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:

     函数名      功能
 pathinfo返回文件的各个组成部份
 basename返回文件名
    dirname文件目录部份
    parse_url 网址拆解成各部份
   http_build_query生成url 中的query字符串
   http_build_url生成一个url

pathinfo

 pathinfo ( string $路径)
功能:传入文件路径返回文件的各个组成部份

实例

<?php
header("Content-type:text/html;charset=utf-8");
$path_parts = pathinfo('D:/www/a.html');
echo '文件目录名:'.$path_parts['dirname']."<br />";
echo '文件全名:'.$path_parts['basename']."<br />";
echo '文件扩展名:'.$path_parts['extension']."<br />";
echo '不包含扩展的文件名:'.$path_parts['filename']."<br />";
?>

程序运行结果:

文件目录名:D:/www
文件全名:a.html
文件扩展名:html
不包含扩展的文件名:a


basename

basename ( string $路径[, string $suffix ])
功能:传入路径返回文件名
第一个参数传入路径。
第二个参数,指定我文件名到了指定字符停止。

实例

<?php
echo "1: ".basename("d:/www/a.html", ".d")."<br>";
echo "2: ".basename("d:/www/include")."<br>";
echo "3: ".basename("d:/www/text.txt")."<br>";
?>

程序运行结果:

 1: a.html
 2: include
 3: text.txt


dirname

dirname(string $路径) 
功能:返回文件路径的文件目录部份

实例

<?php
$a=dirname(__FILE__);
echo$a;
?>

运行一下你的程序


parse_url

 parse_url ( string $路径 )
功能:将网址拆解成各个部份

实例

<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';
var_dump(parse_url($url));
?>

程序运行结果:

 array(8) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(8) "hostname"
  ["port"]=>
  int(9090)
  ["user"]=>
  string(8) "username"
  ["pass"]=>
  string(8) "password"
  ["path"]=>
  string(5) "/path"
  ["query"]=>
  string(9) "arg=value"
  ["fragment"]=>
  string(6) "anchor"
}


http_build_query

http_build_query ( mixed $需要处理的数据)
功能:生成url 中的query字符串

实例

<?php
//定义一个关联数组
$data = [
    'username'=>'liwenkai',
    'area'=>'hubei',
    'pwd'=>'123'
];
//生成query内容
echo http_build_query($data);
?>

程序运行结果:

username=liwenkai&area=hubei&pwd=123


PHP Filesystem 参考手册

如需查看 PHP 文件系统函数的完整参考手册,请访问我们的PHP Filesystem 参考手册。


Weiter lernen
||
<?php header("Content-type:text/html;charset=utf-8"); $data = "我是一个兵,来自老百姓"; $numbytes = file_put_contents('binggege.txt', $data); if($numbytes){ echo '写入成功,我们读取看看结果试试:'; echo file_get_contents('binggege.txt'); }else{ echo '写入失败或者没有权限,注意检查'; } ?>
einreichenCode zurücksetzen