前言
我們在開發的時候,有時候需要涉及到圖片、檔案的上傳下載等操作。比如註冊帳號的時候,有時候需要上傳頭像的圖片,這時候就需要用到檔案的處理,而檔案的樣式有很多種如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,訪問形式) 這個函數中訪問形式有很多,我們常用的只用三種:
r,對檔案進行讀的操作,檔案指標指向頭部
w,對檔案進行寫的操作,如果檔案存在,檔案指標指向頭部,並把裡面的內容清空,如果檔案不存在會建立檔案。
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 '目錄建立失敗'; } }
刪除目錄
<?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 '檔案不存在'; }
遍曆目錄
<?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
總結
PHP中對於檔案的操作還是很重要的,對於檔案的操作要靈活的應用不同的函數。
以上就是PHP基礎教程十五之檔案、目錄的操作的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!