PHP基礎教程十五之檔案、目錄的操作

來源:互聯網
上載者:User


前言


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

檔案的傳輸方式

在PHP語言甚至於其他語言中操作檔案的形式,實質上是操作流的。PHP中共有兩種流(位元組流,二進位流)按照輸出的方式不同還分成輸入資料流和輸出資料流。

檔案的流都是以記憶體參照的, 如果資料是從記憶體儲存磁碟的檔案中,我們稱為輸出資料流,反過來,如果是從檔案想記憶體流動,我們稱為輸入資料流。

檔案的操作方式

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

  • 本地操作

  • 遠程操作

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

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

從協助文檔中可以看到關於操作檔案的函數:

這裡只是列出函數裡面的一些,更多的函數可以查看協助文檔。可以看到在協助文檔一共有81個函數,但是我們不用全部掌握,常用的就那幾個。

對檔案的操作

讀取檔案的相關資訊

我們在操作檔案時,有時候需要知道檔案的相關資訊,比如檔案的大小,檔案的類型,檔案的建立時間,修改時間,訪問時間等等資訊,這裡就會使用到讀取檔案相關資訊的技術,在PHP中分為兩種形式進行檔案資訊的擷取。

讀取檔案相關資訊的第一種方式

<?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. 使用完資源,記得關閉,不然有時候會出現出人意料的錯誤。

讀取檔案資訊的第二種方式

<?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提供了三種方式來讀取檔案。

讀取檔案的第一種方式

<?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”,檔案的內容顯示在網頁上,網頁的分行符號是”<\br>”,注意逸出字元必須用雙引號引起來。

  • 關閉檔案指標資源

讀取檔案的第二種方式

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

<?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(檔案指標) 測試檔案指標是否到了檔案結束的位置,當檔案指標指向最後則不用迴圈。
- 關閉檔案指標資源

讀取檔案的第三種方式

<?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()方法進行整體的讀取。

建立檔案和寫檔案

建立檔案和寫檔案第一種方式

<?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’這種訪問形式進行對檔案內容的追加寫入。

建立檔案和寫檔案第二種方式

<?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 即可。

刪除檔案

<?php    $file_path = 'D:/test.txt';    if(file_exists($file_path)){        if(unlink($file_path)){            echo '檔案刪除成功';        }else{            echo '檔案刪除失敗';        }    }

- 通過unlink(檔案路徑)函數刪除檔案。

修改檔案的名字

<?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 建立一個目錄

    <?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系統下開發是沒有意義的。

<?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是表示建立多級目錄。

刪除目錄

<?php    $dir_path = 'D:/test';    if(is_dir($dir_path)){        //目錄存在        if(rmdir($dir_path)){            echo '目錄刪除成功';        }else{            echo '目錄刪除失敗';        }    }

- 通過rmdir(目錄路徑)刪除目錄。
- 刪除目錄時,下面沒有目錄或者檔案的存在。
- rmdir()函數只能刪除一個目錄,不能刪除多個目錄,刪除多個目錄,可以使用遞迴刪除。

    <?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迴圈不會進入迴圈,而是直接刪除目錄。當有目錄或檔案時,可以在迴圈中遞迴的執行函數,知道遇到是檔案或目錄為空白(基準條件)。

檔案的拷貝

<?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函數直接進行複製拷貝,第一個參數是檔案的路徑,第二個參數是目標的路徑。

遍曆目錄

<?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判斷把這兩個無用的目錄過濾掉。

統計目錄的大小。

<?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基礎教程十五之檔案、目錄的操作的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.