PHP基礎教學十五文件、目錄的操作

黄舟
發布: 2023-03-06 09:08:01
原創
1531 人瀏覽過


前言


我們在開發的時候,有時候需要涉及到圖片、檔案的上傳下載等動作。例如註冊帳號的時候,有時候需要上傳頭像的圖片,這時候就需要用到文件的處理,而文件的樣式有很多種如txt,word,excel等。

檔案的傳輸方式

在PHP語言甚至在其他語言中操作檔案的形式,實質上是操作流程的。 PHP中共有兩種流(位元組流,二進位流)依照輸出的方式不同也分成輸入流和輸出流。
PHP基礎教學十五文件、目錄的操作
檔案的流都是以記憶體參照的, 如果資料是從記憶體保存磁碟的檔案中,我們稱為輸出流,反過來,如果是從檔案想記憶體流動,我們稱為輸入流。

檔案的操作方式

在PHP中檔案的操作方式分為兩種

  • 本機操作

  • 遠端操作

本機操作是在自己的電腦上對檔案進行增刪改查等操作。

遠端操作是遠端存取伺服器,對伺服器上的檔案進行增刪改查等操作。

從幫助文件中可以看到關於操作文件的函數:

PHP基礎教學十五文件、目錄的操作

#這裡只是列出函數裡面的一些,更多的函數可以查看幫助文件.可以看到在幫助文件一共有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,存取形式),該函數開啟一個文件,傳回一個文件指針,指向第一行。第一個參數是檔案的路徑,第二個參數是檔案的存取形式,「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,存取形式) 這個函數中存取形式有很多,我們常用的只用三種:

    1. r,對檔案進行讀取的操作,檔案指標指向頭部

    2. w,對檔案進行寫入的操作,如果檔案存在,檔案指標指向頭部,並把裡面的內容清空,如果檔案不存在會建立檔案。

    3. a,對檔案進行寫的操作,如果檔案存在,檔案指標指向尾部,不會把裡面的內容清空,如果檔案不存在會建立檔案。

  • fread(檔案指標,大小)這個函數就是對檔案進行度的操作,透過取得檔案的大小,把一個檔案整體的寫入到$content中。

  • iconv(輸入的字元集,輸出的字元集,字串) 這個函數是把檔案裡面的函數進行編碼,在檔案中儲存方式gbk,在頁面中儲存方式是utf-8,

  • str_replace(要替換的字符,替環字符,字串)這個函數是把檔案中的換行符轉換,在windows下檔案的換行符是“\r\n”,文件的內容顯示在網頁上,網頁的換行符是”<\br>”,注意轉義字元必須用雙引號引起來。

  • 關閉檔案指標資源

讀取檔案的第二種方式

#在第一種方式中,讀取檔案是一次性的讀取全部,當檔案很大時,這種方式是不合理的,可以使用第二種方式,使用循環讀取,先讀取一部分,合併,在讀取一部分,合併。

<?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基礎教學十五文件、目錄的操作

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

总结

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

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


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!