在本教程中,您將學(xué)習(xí)如何使用PHP處理目錄或文件夾。
在上一章中,您學(xué)習(xí)了如何在PHP中使用文件。同樣,PHP還允許您使用文件系統(tǒng)上的目錄,例如,您可以打開(kāi)目錄并讀取其內(nèi)容,創(chuàng)建或刪除目錄,列出目錄中的所有文件,等等。
您可以通過(guò) mkdir() 使用要?jiǎng)?chuàng)建的目錄的路徑和名稱(chēng)來(lái)調(diào)用 PHP 函數(shù)來(lái)創(chuàng)建一個(gè)新的空目錄,如下例所示:
<?php //目錄路徑 $dir = "testdir"; // 檢查目錄是否存在 if(!file_exists($dir)){ //嘗試創(chuàng)建目錄 if(mkdir($dir)){ echo "目錄創(chuàng)建成功。"; } else{ echo "錯(cuò)誤:無(wú)法創(chuàng)建目錄。"; } } else{ echo "錯(cuò)誤:目錄已存在。"; } ?>
為了使 mkdir() 函數(shù)工作,已經(jīng)存在于參數(shù)的目錄路徑的父目錄,例如,如果你指定的目錄路徑 testdir/subdir 比 testdir 以其他方式存在PHP將產(chǎn)生一個(gè)錯(cuò)誤。
您可以通過(guò)調(diào)用PHP copy()函數(shù)并將文件的源路徑和目標(biāo)路徑作為參數(shù)來(lái)將文件從一個(gè)位置復(fù)制到另一位置。如果目標(biāo)文件已經(jīng)存在,它將被覆蓋。這是一個(gè)在備份文件夾中創(chuàng)建“ example.txt”文件副本的示例。
<?php //源文件路徑 $file = "example.txt"; //目標(biāo)文件路徑 $newfile = "backup/example.txt"; // 檢查文件是否存在 if(file_exists($file)){ //嘗試復(fù)制文件 if(copy($file, $newfile)){ echo "文件復(fù)制成功。"; } else{ echo "錯(cuò)誤:無(wú)法復(fù)制文件。"; } } else{ echo "錯(cuò)誤:文件不存在。"; } ?>
為了使該示例生效,必須已經(jīng)存在備份目標(biāo)目錄和源文件“ example.txt”。否則,PHP將產(chǎn)生錯(cuò)誤。
您可以使用PHP scandir()函數(shù)列出指定路徑內(nèi)的文件和目錄。
現(xiàn)在,我們將創(chuàng)建一個(gè)自定義函數(shù),該函數(shù)將使用PHP遞歸列出目錄中的所有文件。如果您正在使用深度嵌套的目錄結(jié)構(gòu),則此腳本將很有幫助。
<?php //定義一個(gè)函數(shù)以輸出目錄中的文件 function outputFiles($path){ //檢查目錄是否存在 if(file_exists($path) && is_dir($path)){ //掃描此目錄中的文件 $result = scandir($path); // 過(guò)濾掉當(dāng)前的(.)和父目錄(..) $files = array_diff($result, array('.', '..')); if(count($files) > 0){ //循環(huán)遍歷重新調(diào)諧的數(shù)組 foreach($files as $file){ if(is_file("$path/$file")){ //顯示文件名 echo $file . "<br>"; } else if(is_dir("$path/$file")){ //如果找到目錄,則遞歸調(diào)用該函數(shù) outputFiles("$path/$file"); } } } else{ echo "錯(cuò)誤:在目錄中找不到文件。"; } } else { echo "錯(cuò)誤:該目錄不存在。"; } } //調(diào)用函數(shù) outputFiles("mydir"); ?>
在處理目錄和文件結(jié)構(gòu)時(shí),有時(shí)您可能需要查找目錄中的某些類(lèi)型的文件,例如僅列出文件 .text 或 .png 文件等。您可以使用PHP glob()函數(shù)輕松地做到這一點(diǎn),該函數(shù)根據(jù)模式匹配文件。
以下示例中的PHP代碼將搜索 documents 目錄并列出所有帶有 .text 擴(kuò)展名的文件。它不會(huì)搜索子目錄。
<?php /* 搜索目錄并循環(huán)瀏覽,返回包含匹配文件的數(shù)組 */ foreach(glob("documents/*.txt") as $file){ echo basename($file) . " (size: " . filesize($file) . " bytes)" . "<br>"; } ?>
glob()函數(shù)還可用于查找目錄或其子目錄中的所有文件。下例中定義的函數(shù)將遞歸列出目錄中的所有文件,就像我們?cè)谏侠惺褂?scandir() 函數(shù) 所做的那樣。
<?php //定義函數(shù)以輸出目錄中的文件 function outputFiles($path){ //檢查目錄是否存在 if(file_exists($path) && is_dir($path)){ // 搜索該目錄中的文件 $files = glob($path ."/*"); if(count($files) > 0){ //遍歷重新調(diào)整的數(shù)組 foreach($files as $file){ if(is_file("$file")){ //僅顯示文件名 echo basename($file) . "<br>"; } else if(is_dir("$file")){ //如果找到目錄,則遞歸調(diào)用該函數(shù) outputFiles("$file"); } } } else{ echo "錯(cuò)誤:在目錄中找不到此類(lèi)文件。"; } } else { echo "錯(cuò)誤:該目錄不存在。"; } } //調(diào)用函數(shù) outputFiles("mydir"); ?>