>  기사  >  백엔드 개발  >  PHP 기본 튜토리얼 15: 파일 및 디렉터리 작업

PHP 기본 튜토리얼 15: 파일 및 디렉터리 작업

黄舟
黄舟원래의
2017-03-01 10:21:461546검색


서문


개발을 하다 보면 사진이나 파일을 업로드하고 다운로드해야 할 때가 있습니다. 예를 들어, 계정을 등록할 때 아바타 사진을 업로드해야 하는 경우가 있는데 이때 파일 처리를 사용해야 하는데 txt, word, excel 등 다양한 파일 형식이 있습니다.

파일 전송 방법

PHP 언어나 심지어 다른 언어로 파일을 조작하는 방법은 본질적으로 스트림 조작입니다. PHP에는 두 가지 유형의 스트림(바이트 스트림, 바이너리 스트림)이 있으며, 서로 다른 출력 방법에 따라 입력 스트림과 출력 스트림으로 구분됩니다.
PHP 기본 튜토리얼 15: 파일 및 디렉터리 작업
파일 스트림은 모두 메모리에서 참조됩니다. 데이터가 메모리에서 디스크의 파일로 저장되면 이를 출력 스트림이라고 부릅니다. 반대로 데이터가 파일에서 메모리로 흐른다면 출력 스트림이라고 부릅니다.

파일 조작 방법

PHP에서 파일을 조작하는 방법은 두 가지가 있습니다.

  • 로컬 조작

  • 원격 작업

로컬 작업은 자신의 컴퓨터에 있는 파일을 추가, 삭제, 수정, 확인하는 작업입니다.

원격작업이란 원격으로 서버에 접속하여 서버에 있는 파일의 추가, 삭제, 수정, 확인 등의 작업을 수행하는 것을 말합니다.

도움말 문서에서 파일 운영에 대한 기능을 볼 수 있습니다.

PHP 기본 튜토리얼 15: 파일 및 디렉터리 작업

다음은 나열된 기능 중 일부입니다. 도움말 문서. 도움말 문서에 총 81개의 기능이 있는 것을 볼 수 있지만, 모두 마스터할 필요는 없고 일반적으로 사용되는 기능만 익히면 됩니다.

파일 조작

파일 관련 정보 읽기

파일을 조작할 때 파일 크기, 파일 크기, 파일 크기 등 파일 관련 정보를 알아야 할 때가 있습니다. 유형, 파일 생성 시간, 수정 시간, 액세스 시간 및 기타 정보, 여기서는 파일 관련 정보를 읽는 기술이 사용되며 이는 파일 정보를 얻기 위해 PHP에서 두 가지 형태로 나뉩니다.

파일 관련 정보를 읽는 첫 번째 방법

<?php

    //写一个变量记录文件的路径
    $file_path = "D:/config.txt";

    if(file_exists($file_path)){
        //文件存在
        if($fp = fopen($file_path,&#39;r&#39;)){
            //$type是一个存放文件信息的数组
            $type = fstat($fp);
            echo &#39;<br>文件的字节是:&#39; . $type[&#39;size&#39;];
            echo &#39;<br>文件创建时间是:&#39; . date(&#39;Y-m-d H:i:s&#39;,$type[&#39;ctime&#39;]);
            echo &#39;<br>文件访问时间是:&#39; . date(&#39;Y-m-d H:i:s&#39;,$type[&#39;atime&#39;]);
            echo &#39;<br>文件修改时间是:&#39; .date(&#39;Y-m-d H:i:s&#39;,$type[&#39;mtime&#39;]);
            //关闭资源
            fclose($fp);
        }else{
            echo &#39;文件打开失败&#39;;
        }
    }else{
        echo &#39;文件不存在&#39;;
    }
    ......结果.......
    文件的字节是: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, access form)을 통해 수행됩니다. 파일을 열고 첫 번째 행을 가리키는 파일 포인터를 반환합니다. 첫 번째 매개변수는 파일의 경로, 두 번째 매개변수는 파일의 액세스 형식, "r"은 파일 읽기를 의미합니다.
4. fstat(파일 포인터)는 열린 파일 포인터를 통해 파일 정보를 얻고 우리가 원하는 값을 가진 일부 연관 배열을 포함하는 배열을 반환합니다.
5. 리소스를 사용한 후에는 닫아야 합니다. 그렇지 않으면 예상치 못한 오류가 발생할 수 있습니다.

파일 정보를 읽는 두 번째 방법

<?php

    $file_path = &#39;D:/config.txt&#39;;
    echo &#39;<br>文件的类型是:&#39; . filetype($file_path);
    echo &#39;<br>文件的大小是:&#39; . filesize($file_path);
    echo &#39;<br>文件的创建时间是:&#39; . date(&#39;Y-m-d H:i:s&#39;,filectime($file_path));
    echo &#39;<br>文件的访问时间是:&#39; .date(&#39;Y-m-d H:i:s&#39;,fileatime($file_path));
    echo &#39;<br>文件的修改时间是:&#39; . date(&#39;Y-m-d H:i:s&#39;,filemtime($file_path));
    .....结果.....
    文件的类型是:file
    文件的大小是:22
    文件的创建时间是:2016-10-12 20:34:56
    文件的访问时间是:2016-10-12 20:34:56
    文件的修改时间是:2016-10-12 20:35:08

이 방법은 비교적 간단합니다. 함수를 통해 파일의 관련 정보를 직접 가져오지만, 각 함수의 하단에서 파일을 열어야 합니다. . 작동하다.

파일 내용 읽기

파일을 조작할 때 파일 내용을 읽어야 하는 경우가 많습니다. PHP는 파일을 읽는 세 가지 방법을 제공합니다.

파일을 읽는 첫 번째 방법

<?php
    header("Content-type:text/html;charset = utf-8");
    $file_path = &#39;D:/config.txt&#39;;

    if(file_exists($file_path)){

        if($fp = fopen($file_path,&#39;r&#39;)){
            //获取文件的大小
            $file_size = fstat($fp)[&#39;size&#39;];
            $content = fread($fp, $file_size);
            //对文件中中文进行编码
            $content = iconv(&#39;gbk&#39;, &#39;utf-8&#39;, $content);
            //对换行符进行替换。
            $content = str_replace("\r\n", "<br>", $content);
            echo $content;
            fclose($fp);
        }else{
            echo &#39;文件打开失败&#39;;
        }
    }else{
        echo &#39;文件不存在&#39;;
    }
    ......结果.......
    这是一些配置文件信息。
    user = abc;
    password = 122;
  • 파일의 전체 경로 정의

  • file_exists($path) 판단 파일 존재 여부

  • fopen($path, access form) 이 함수에는 여러 가지 액세스 형식이 있습니다.

  1. r, 파일 읽기, 파일 포인터가 헤드를 가리킴

  2. w, 파일 쓰기, 파일이 존재하면 파일 포인터가 헤드를 가리킴 , 내용을 지우고 파일이 없으면 생성합니다.

  3. a는 파일에 쓰기 작업을 수행합니다. 파일이 있으면 파일 포인터가 끝을 가리키고 파일이 없으면 내부 내용이 지워지지 않습니다. , 파일이 생성됩니다.

  • fread(파일 포인터, 크기) 파일 작업을 수행하는 함수입니다. 파일 크기를 가져와서 파일을 전체적으로 씁니다. $content.

  • iconv(입력 문자 집합, 출력 문자 집합, 문자열) 이 함수는 파일에 함수를 인코딩하여 gbk 및 페이지에 파일에 저장합니다. ,

  • str_replace(바꿀 문자, 링 문자, 문자열) Windows에서 파일의 개행 문자를 변환하는 함수입니다. ". 파일의 내용이 웹 페이지에 표시됩니다. 웹 페이지의 개행 문자는 "
    "입니다. 이스케이프 문자는 큰따옴표로 묶어야 합니다.

  • 파일 포인터 리소스 닫기

  • 파일을 읽는 두 번째 방법

    첫 번째 방법은 Fetching the 파일 전체를 한 번에 읽는 방법이므로 파일이 매우 큰 경우에는 두 번째 방법인 루프 읽기를 사용하여 먼저 부분을 읽고 병합한 다음 부분을 읽어서 병합하는 방법을 사용할 수 있습니다.

    <?php
    
        $file_path = &#39;D:/config.txt&#39;;
    
        if(file_exists($file_path)){
            if($fp = fopen($file_path,&#39;r&#39;)){
                //文件太大,分字节度
                $size = 1024;//每次读取1024个字节
                $tmp_content = &#39;&#39;;//存放一次读取的内容
                $content = &#39;&#39;;//存放总的内容。
                while(!feof($fp)){
                    $tmp_content = fread($fp,$size);
                    $content .= $tmp_content;
                }
    
                $content = iconv(&#39;gbk&#39;, &#39;utf-8&#39;, $content);
                $content = str_replace("\r\n", "<br>", $content);
                echo $content;
                fclose($fp);
    
            }else{
                echo &#39;文件打开失败&#39;;
            }
    
        }else{
            echo &#39;文件不存在&#39;;
        }
        ......结果.......
        这是一些配置文件信息。
        user = abc;
        password = 122;

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

    读取文件的第三种方式

    <?php
        $file_path = &#39;D:/config.txt&#39;;
        $content =  file_get_contents($file_path);
        $content = iconv(&#39;gbk&#39;,&#39;utf-8&#39;,$content);
        $content = str_replace("\r\n","<br>",$content);
        echo $content;
        ......结果.......
        这是一些配置文件信息。
        user = abc;
        password = 122;

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

    创建文件和写文件

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

    <?php
        //定义文件的路径
        $file_path = &#39;D:/test.txt&#39;;
    
        if(!file_exists($file_path)){
            //文件不存在
            //fopen()函数使用w这种访问形式,
            if($fp = fopen($file_path, &#39;w&#39;)){
                $str = &#39;&#39;;
                for($i = 0; $i < 10; $i++){
                    $str .= "hello,php\r\n";
                }
                //向文件中写数据
                fwrite($fp, $str);
                fclose($fp);
            }
        }

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

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

    <?php
        //定义文件的路径
        $file_path = &#39;D:/test.txt&#39;;
    
        if(!file_exists($file_path)){
            $str = &#39;&#39;;
            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 即可。

    删除文件

    <?php
        $file_path = &#39;D:/test.txt&#39;;
    
        if(file_exists($file_path)){
            if(unlink($file_path)){
                echo &#39;文件删除成功&#39;;
            }else{
                echo &#39;文件删除失败&#39;;
            }
        }

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

    修改文件的名字

    <?php
        $file_path = &#39;D:/test.txt&#39;;
        $file_newPath = &#39;D:/newtest.txt&#39;;
    
        if(file_exists($file_path)){
            if(rename($file_path,$file_newPath)){
                echo &#39;文件名修改成功&#39;;
            }else{
                echo &#39;文件名修改失败&#39;;
            }
        }

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

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


    对目录的操作

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

    • is_dir 判断是否是一个目录

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

    • mkdir 创建一个目录

      <?php
      
          $dir_path = &#39;D:/test&#39;;
          //判断目录是否存在
          if(is_dir($dir_path)){
              echo &#39;目录存在&#39;;
          }else{
              //目录不存在,创建目录
              if(mkdir($dir_path)){
                  echo &#39;目录创建成功&#39;;
              }else{
                  echo &#39;目录创建失败&#39;;
              }
          }
    • 上面先判断目录是否存在,不存在使用mkdir()函数进行目录的创建。

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

    <?php
    
        $dir_path = &#39;D:/test/a/b/c/d&#39;;
        //判断目录是否存在
        if(is_dir($dir_path)){
            echo &#39;目录存在&#39;;
        }else{
            //目录不存在,创建目录
            if(mkdir($dir_path,0777,true)){
                echo &#39;目录创建成功&#39;;
            }else{
                echo &#39;目录创建失败&#39;;
            }
        }
    • 可以看到在创建目录的函数中添加了两个参数,就能创建多级目录。0777是在linux下的最大访问权限,而true是表示创建多级目录。

    删除目录

    <?php
        $dir_path = &#39;D:/test&#39;;
    
        if(is_dir($dir_path)){
            //目录存在
            if(rmdir($dir_path)){
                echo &#39;目录删除成功&#39;;
            }else{
                echo &#39;目录删除失败&#39;;
            }
        }

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

        <?php
    
            //在这里test目录下的全目录是:D:/test/a/b/c/d
            $dir_path = &#39;D:/test&#39;;
            delDir($dir_path);
            function delDir($dir_path){
                //打开当前的目录
                $dir = opendir($dir_path);
                //通过readdir函数获取目录下的所有目录
                while(false !== ($fileName = readdir($dir))){
                    //对当前的目录进行拼接
                    if($fileName != &#39;.&#39; && $fileName != &#39;..&#39;){
                        $dir_name = $dir_path . &#39;/&#39; . $fileName;
                        if(is_dir($dir_name)){
                            //是一个目录,通过递归在此判断。
                            delDir($dir_name);
                            //递归完成,当前目录下为空,删除目录。
                        }else if(is_file($dir_name)){
                            //是文件删除文件。
                            unlink($dir_name);
                        }
                    }
    
                }
                closedir($dir);
                rmdir($dir_path);
            }

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

    文件的拷贝

    <?php
        //当前需要复制的文件路径。
        $file_path = &#39;D:/Desert.jpg&#39;;
        //需要复制到哪的路径
        $path = "E:/desert.jpg";
        if(file_exists($file_path)){
            if(copy($file_path,$path)){
                echo &#39;复制成功&#39;;
            }else{
                echo &#39;复制失败&#39;;
            }
    
        }else{
            echo &#39;文件不存在&#39;;
        }
    • 定义的文件的全路径

    • 定义目标的路径。

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

    遍历目录

    <?php
    
        $dir_path = &#39;D:/test&#39;;
        isDir($dir_path);
        function isDir($dir_path){
            if(is_dir($dir_path)){
                //存在文件
                $dir = opendir($dir_path);
                //打开目录
                while(($fileName = readdir($dir)) !== false){
                    if($fileName != &#39;.&#39; && $fileName != &#39;..&#39;){
                        if(is_dir($dir_path . &#39;/&#39; . $fileName)){
                            echo &#39;<br>目录名是:&#39; . $fileName;
                            isDir($dir_path . &#39;/&#39; . $fileName);
                        }else if(is_file($dir_path . &#39;/&#39; . $fileName)){
                            echo &#39;<br>文件名是:&#39; . $fileName;
                        }
                    }
    
                }
                //关闭资源
                closedir($dir);
            }
        }
        ......结果.......
        目录名是:a
        文件名是:a.txt
        目录名是:b
        目录名是:c
        目录名是:d
        文件名是:n.doc
        文件名是:c.txt

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

    统计目录的大小。

    <?php
    
        $dir_path = &#39;D:/test&#39;;
        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 != &#39;.&#39; && $fileName != &#39;..&#39;){
    
                        if(is_dir($dir_path . &#39;/&#39; . $fileName)){
                            //通过递归进行循环的获取字节大小。
                            $size += getSize($dir_path . &#39;/&#39; . $fileName); 
    
                        }else if(is_file($dir_path . &#39;/&#39; . $fileName)){
    
                            $size +=filesize($dir_path . &#39;/&#39; . $fileName);
                        }
                    }
                }
            }
            //关闭资源。
            fclose($dir);
            return $size;
        }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
        .......结果.......
        47

    PHP 기본 튜토리얼 15: 파일 및 디렉터리 작업

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

    总结

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

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


    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.