PHP基础教程十五之文件、目录的操作

黄舟
发布: 2017-03-01 10:21:46
原创
1719人浏览过


前言

我们在开发的时候,有时候需要涉及到图片、文件的上传下载等操作。比如注册账号的时候,有时候需要上传头像的图片,这时候就需要用到文件的处理,而文件的样式有很多种如txt,word,excel等。

文件的传输方式

在PHP语言甚至于其他语言中操作文件的形式,实质上是操作流的。PHP中共有两种流(字节流,二进制流)按照输出的方式不同还分成输入流和输出流。
这里写图片描述
文件的流都是以内存参照的, 如果数据是从内存保存磁盘的文件中,我们称为输出流,反过来,如果是从文件想内存流动,我们称为输入流。

文件的操作方式

在PHP中文件的操作方式分为两种

本地操作是在自己的电脑上对文件进行增删改查等操作。

远程操作是远程访问服务器,对服务器上的文件进行增删改查等操作。

从帮助文档中可以看到关于操作文件的函数:

这里写图片描述

这里只是列出函数里面的一些,更多的函数可以查看帮助文档。可以看到在帮助文档一共有81个函数,但是我们不用全部掌握,常用的就那几个。

对文件的操作

读取文件的相关信息

我们在操作文件时,有时候需要知道文件的相关信息,比如文件的大小,文件的类型,文件的创建时间,修改时间,访问时间等等信息,这里就会使用到读取文件相关信息的技术,在PHP中分为两种形式进行文件信息的获取。

读取文件相关信息的第一种方式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<?php

 

    //写一个变量记录文件的路径

    $file_path = "D:/config.txt";

 

    if(file_exists($file_path)){

        //文件存在

        if($fp = fopen($file_path,'r')){

            //$type是一个存放文件信息的数组

            $type = fstat($fp);

            echo '<br>文件的字节是:' . $type['size'];

            echo '<br>文件创建时间是:' . date('Y-m-d H:i:s',$type['ctime']);

            echo '<br>文件访问时间是:' . date('Y-m-d H:i:s',$type['atime']);

            echo '<br>文件修改时间是:' .date('Y-m-d H:i:s',$type['mtime']);

            //关闭资源

            fclose($fp);

        }else{

            echo '文件打开失败';

        }

    }else{

        echo '文件不存在';

    }

    ......结果.......

    文件的字节是:22

    文件创建时间是:2016-10-12 20:34:56

    文件访问时间是:2016-10-12 20:34:56

    文件修改时间是:2016-10-12 20:35:08

登录后复制

1. 我们先定义一个路径是我们访问的文件,这个路径可以是相对路径,也可以是绝对路径。
2.  通过file_exists($path)函数判断文件是否存在,存在返回true,不存在返回false.
3. 通过fopen($path,访问形式),该函数打开一个文件,返回一个文件指针,指向第一行。第一个参数是文件的路径,第二个参数是文件的访问形式,“r”表示对文件进行读。
4. fstat(文件指针)通过已打开的文件指针取得文件信息,返回一个数组,里面有一些关联数组是我们想要的值。
5. 使用完资源,记得关闭,不然有时候会出现出人意料的错误。

读取文件信息的第二种方式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

 

    $file_path = 'D:/config.txt';

    echo '<br>文件的类型是:' . filetype($file_path);

    echo '<br>文件的大小是:' . filesize($file_path);

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

    echo '<br>文件的访问时间是:' .date('Y-m-d H:i:s',fileatime($file_path));

    echo '<br>文件的修改时间是:' . date('Y-m-d H:i:s',filemtime($file_path));

    .....结果.....

    文件的类型是:file

    文件的大小是:22

    文件的创建时间是:2016-10-12 20:34:56

    文件的访问时间是:2016-10-12 20:34:56

    文件的修改时间是:2016-10-12 20:35:08

登录后复制

这种方式比较简单,通过函数来直接获取文件的相关信息,不过应该在每个函数底层都打开了文件进行操作。

读取文件的内容

我们操作文件往往需要读取文件里面的内容,PHP提供了三种方式来读取文件。

读取文件的第一种方式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<?php

    header("Content-type:text/html;charset = utf-8");

    $file_path = 'D:/config.txt';

 

    if(file_exists($file_path)){

 

        if($fp = fopen($file_path,'r')){

            //获取文件的大小

            $file_size = fstat($fp)['size'];

            $content = fread($fp, $file_size);

            //对文件中中文进行编码

            $content = iconv('gbk', 'utf-8', $content);

            //对换行符进行替换。

            $content = str_replace("\r\n", "<br>", $content);

            echo $content;

            fclose($fp);

        }else{

            echo '文件打开失败';

        }

    }else{

        echo '文件不存在';

    }

    ......结果.......

    这是一些配置文件信息。

    user = abc;

    password = 122;

登录后复制
  • 定义文件的全路径

  • file_exists($path)判断文件是否存在

  • fopen($path,访问形式) 这个函数中访问形式有很多,我们常用的只用三种:

  1. r,对文件进行读的操作,文件指针指向头部

  2. w,对文件进行写的操作,如果文件存在,文件指针指向头部,并把里面的内容清空,如果文件不存在会创建文件。

  3. a,对文件进行写的操作,如果文件存在,文件指针指向尾部,不会把里面的内容清空,如果文件不存在会创建文件。

  • fread(文件指针,大小)这个函数就是对文件进行度的操作,通过获取文件的大小,把一个文件整体的写入到$content中。

  • iconv(输入的字符集,输出的字符集,字符串) 这个函数是把文件里面的函数进行编码,在文件中存储方式gbk,在页面中存储方式是utf-8,

  • str_replace(要替换的字符,替环字符,字符串)这个函数是把文件中的换行符进行转换,在windows下文件的换行符是“\r\n”,文件的内容显示在网页上,网页的换行符是””,注意转义字符必须用双引号引起来。

  • 关闭文件指针资源

  • 读取文件的第二种方式

    在第一种方式中,读取文件是一次性的读取全部,当文件很大时,这种方式是不合理的,可以使用第二种方式,使用循环读取,先读取一部分,合并,在读取一部分,合并。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    <?php

     

        $file_path = 'D:/config.txt';

     

        if(file_exists($file_path)){

            if($fp = fopen($file_path,'r')){

                //文件太大,分字节度

                $size = 1024;//每次读取1024个字节

                $tmp_content = '';//存放一次读取的内容

                $content = '';//存放总的内容。

                while(!feof($fp)){

                    $tmp_content = fread($fp,$size);

                    $content .= $tmp_content;

                }

     

                $content = iconv('gbk', 'utf-8', $content);

                $content = str_replace("\r\n", "<br>", $content);

                echo $content;

                fclose($fp);

     

            }else{

                echo '文件打开失败';

            }

     

        }else{

            echo '文件不存在';

        }

        ......结果.......

        这是一些配置文件信息。

        user = abc;

        password = 122;

    登录后复制

    - 从上面的代码中可以看出来,读取文件的内容是分块读取的,读取一次,拼接到总的内容上。
    - feof(文件指针) 测试文件指针是否到了文件结束的位置,当文件指针指向最后则不用循环。
    - 关闭文件指针资源

    读取文件的第三种方式

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    <?php

        $file_path = 'D:/config.txt';

        $content file_get_contents($file_path);

        $content = iconv('gbk','utf-8',$content);

        $content = str_replace("\r\n","<br>",$content);

        echo $content;

        ......结果.......

        这是一些配置文件信息。

        user = abc;

        password = 122;

    登录后复制

    第三种方式是最简单的一种方式,通过file_get_contents()方法进行整体的读取。

    创建文件和写文件

    创建文件和写文件第一种方式

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    <?php

        //定义文件的路径

        $file_path = 'D:/test.txt';

     

        if(!file_exists($file_path)){

            //文件不存在

            //fopen()函数使用w这种访问形式,

            if($fp = fopen($file_path, 'w')){

                $str = '';

                for($i = 0; $i < 10; $i++){

                    $str .= "hello,php\r\n";

                }

                //向文件中写数据

                fwrite($fp, $str);

                fclose($fp);

            }

        }

    登录后复制

    - 当文件不存在的使用使用fopen()打开文件是自动创建文件的,这里使用的文件访问形式是w,文件指针指向头部,清空文件里面的内容。
    - 通过fread()函数想文件中写文件。
    - 当文件存在的时候我们可以使用’a’这种访问形式进行对文件内容的追加写入。

    创建文件和写文件第二种方式

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    <?php

        //定义文件的路径

        $file_path = 'D:/test.txt';

     

        if(!file_exists($file_path)){

            $str = '';

            for($i = 0; $i < 10; $i++){

                $str .= "hello,php\r\n";

            }

     

            file_put_contents($file_path, $str);

     

        }

    登录后复制

    - 使用file_put_contents()函数进行文件的写入,这个函数也是当文件不存在的时候,创建文件。
    - 如果我们通过file_put_contents函数来追加新的内容到文件中,应该在使用file_put_contents函数时,带上第三个参数 FILE_APPEND 即可。

    删除文件

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    <?php

        $file_path = 'D:/test.txt';

     

        if(file_exists($file_path)){

            if(unlink($file_path)){

                echo '文件删除成功';

            }else{

                echo '文件删除失败';

            }

        }

    登录后复制

    - 通过unlink(文件路径)函数删除文件。

    修改文件的名字

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    <?php

        $file_path = 'D:/test.txt';

        $file_newPath = 'D:/newtest.txt';

     

        if(file_exists($file_path)){

            if(rename($file_path,$file_newPath)){

                echo '文件名修改成功';

            }else{

                echo '文件名修改失败';

            }

        }

    登录后复制

    - 修改文件的名字可以通过rename(

    新的文件名)进行修改,当修改成功时返回true,失败返回false。这个函数还可以移动文件的位置。

    对目录的操作

    在php文件编程中,目录也是一种文件,是一种比较特殊的文件,因此对目录的操作有固定的操作方法,主要的方法有三个 is_dir,rmdir,mkdir

    • is_dir 判断是否是一个目录

    • rmdir 删除一个目录,当目录下面有文件或目录的时候不能删除。

    • mkdir 创建一个目录

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      <?php

       

          $dir_path = 'D:/test';

          //判断目录是否存在

          if(is_dir($dir_path)){

              echo '目录存在';

          }else{

              //目录不存在,创建目录

              if(mkdir($dir_path)){

                  echo '目录创建成功';

              }else{

                  echo '目录创建失败';

              }

          }

      登录后复制
    • 上面先判断目录是否存在,不存在使用mkdir()函数进行目录的创建。

    上面的代码只能创建一级目录,当路径名字换成$dir_path = ‘D:/test/a/b/c/d’时,在test目录下还有目录,这时候用上面的方法就会报错,不能够创建多级目录。这时候也可以使用mkdir()函数进行创建,但是在函数中多了两个参数,这两个参数对于windows系统下开发是没有意义的。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    <?php

     

        $dir_path = 'D:/test/a/b/c/d';

        //判断目录是否存在

        if(is_dir($dir_path)){

            echo '目录存在';

        }else{

            //目录不存在,创建目录

            if(mkdir($dir_path,0777,true)){

                echo '目录创建成功';

            }else{

                echo '目录创建失败';

            }

        }

    登录后复制
    • 可以看到在创建目录的函数中添加了两个参数,就能创建多级目录。0777是在linux下的最大访问权限,而true是表示创建多级目录。

    删除目录

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    <?php

        $dir_path = 'D:/test';

     

        if(is_dir($dir_path)){

            //目录存在

            if(rmdir($dir_path)){

                echo '目录删除成功';

            }else{

                echo '目录删除失败';

            }

        }

    登录后复制

    - 通过rmdir(目录路径)删除目录。
    - 删除目录时,下面没有目录或者文件的存在。
    - rmdir()函数只能删除一个目录,不能删除多个目录,删除多个目录,可以使用递归删除。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    <?php

     

        //在这里test目录下的全目录是:D:/test/a/b/c/d

        $dir_path = 'D:/test';

        delDir($dir_path);

        function delDir($dir_path){

            //打开当前的目录

            $dir = opendir($dir_path);

            //通过readdir函数获取目录下的所有目录

            while(false !== ($fileName = readdir($dir))){

                //对当前的目录进行拼接

                if($fileName != '.' && $fileName != '..'){

                    $dir_name = $dir_path . '/' . $fileName;

                    if(is_dir($dir_name)){

                        //是一个目录,通过递归在此判断。

                        delDir($dir_name);

                        //递归完成,当前目录下为空,删除目录。

                    }else if(is_file($dir_name)){

                        //是文件删除文件。

                        unlink($dir_name);

                    }

                }

     

            }

            closedir($dir);

            rmdir($dir_path);

        }

    登录后复制

    把文件删除的操作封装到函数中,如果目录下没有文件则while循环不会进入循环,而是直接删除目录。当有目录或文件时,可以在循环中递归的执行函数,知道遇到是文件或目录为空(基准条件)。

    文件的拷贝

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    <?php

        //当前需要复制的文件路径。

        $file_path = 'D:/Desert.jpg';

        //需要复制到哪的路径

        $path = "E:/desert.jpg";

        if(file_exists($file_path)){

            if(copy($file_path,$path)){

                echo '复制成功';

            }else{

                echo '复制失败';

            }

     

        }else{

            echo '文件不存在';

        }

    登录后复制
    • 定义的文件的全路径

    • 定义目标的路径。

    • 利用copy函数直接进行复制拷贝,第一个参数是文件的路径,第二个参数是目标的路径。

    遍历目录

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    <?php

     

        $dir_path = 'D:/test';

        isDir($dir_path);

        function isDir($dir_path){

            if(is_dir($dir_path)){

                //存在文件

                $dir = opendir($dir_path);

                //打开目录

                while(($fileName = readdir($dir)) !== false){

                    if($fileName != '.' && $fileName != '..'){

                        if(is_dir($dir_path . '/' . $fileName)){

                            echo '<br>目录名是:' . $fileName;

                            isDir($dir_path . '/' . $fileName);

                        }else if(is_file($dir_path . '/' . $fileName)){

                            echo '<br>文件名是:' . $fileName;

                        }

                    }

     

                }

                //关闭资源

                closedir($dir);

            }

        }

        ......结果.......

        目录名是:a

        文件名是:a.txt

        目录名是:b

        目录名是:c

        目录名是:d

        文件名是:n.doc

        文件名是:c.txt

    登录后复制

    * 通过递归进行循环的判断一个目录下面的所有目录和文件,进行输出。
    * 在每个目录下都隐藏着两个无用的目录,所以通过if判断把这两个无用的目录过滤掉。

    统计目录的大小。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    <?php

     

        $dir_path = 'D:/test';

        echo getSize($dir_path);

     

        function getSize($dir_path){

            //定义字节。

            $size = 0;

            //判断是否目录

            if(is_dir($dir_path)){

                //打开目录

                $dir = opendir($dir_path);

     

                //判断每个目录是否存在。

                while(false !== ($fileName = readdir($dir))){

                    //过滤无用的两个目录。

                    if($fileName != '.' && $fileName != '..'){

     

                        if(is_dir($dir_path . '/' . $fileName)){

                            //通过递归进行循环的获取字节大小。

                            $size += getSize($dir_path . '/' . $fileName);

     

                        }else if(is_file($dir_path . '/' . $fileName)){

     

                            $size +=filesize($dir_path . '/' . $fileName);

                        }

                    }

                }

            }

            //关闭资源。

            fclose($dir);

            return $size;

        }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

        .......结果.......

        47

    登录后复制

    这里写图片描述

    • 获取目录的字节通过递归完成。定义$size记录每个文件的大小,返回。

    总结

    PHP中对于文件的操作还是很重要的,对于文件的操作要灵活的应用不同的函数。

     以上就是PHP基础教程十五之文件、目录的操作的内容,更多相关内容请关注PHP中文网(www.php.cn)!

    PHP速学教程(入门到精通)
    PHP速学教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载
    来源:php中文网
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    最新问题
    开源免费商场系统广告
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习
    PHP中文网抖音号
    发现有趣的

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号