遍曆目錄或遍曆目錄下指定類型的檔案,這是每一個童鞋在寫程式的時候難免會用到的。PHP本身也提供了很多灰常有用的函數,正確地使用它們,不會有錯滴。
下面就我個人學習過程中的一些總結,希望對想學PHP的童鞋有所協助。
//本函數可以列出指定目錄下所有的檔案(包括子目錄下的)
代碼如下
function getfiles($path){
foreach(scandir($path) as $afile)
{
if($afile=='.'||$afile=='..') continue;
if(is_dir($path.'/'.$afile))
{
getfiles($path.'/'.$afile);
} else {
echo $path.'/'.$afile.'<br />';
}
}
} //簡單的demo,列出目前的目錄下所有的檔案
getfiles(__DIR__);
scandir() 是返回指定目錄下所有的檔案和目錄組成的數組,在PHP中,還提供了一個灰常強大的函數glob(),glob()有2個參數,至於第2個參數是可選的,稍後再講。 直接來看,用glob()怎麼遍曆目錄的。
//
//可以看出,glob()返回的內容中已經過濾掉了'.'和'..',其中*表示遍曆目錄下所有檔案。相應的,如果改為*.txt,則會遍曆目錄下所的txt檔案。是不是很方便呢?它的方便之處可不止這一點,據元芳說,這裡面還藏著一個天大的秘密,是什麼呢?以後再說,有興趣的話,可以給我留言交流。
代碼如下
function getfiles($path){
foreach(glob($path) as $afile){
if(is_dir($afile))
{ getfiles($afile.'/*'); } else { echo $afile.'<br />'; }
}
} //簡單的demo,列出目前的目錄下所有的檔案
getfiles(__DIR__);0
既然說用 *.txt,就會遍曆目錄下所的txt檔案,那如果我想讓它同時遍曆某幾種格式的檔案呢?怎麼辦?肯定有童鞋想到用數組了,然後很快的寫出來替換進去{*.txt,*.jpg,*.zip,...},當然也很快地發現,程式返回false,什麼都得不到。不要失望,這涉及到了剛才所說的第2個選擇性參數,這個參數是用來改變glob的行為的,具體都有些什麼,可以查閱PHP手冊,這裡不多講,只說一個GLOB_BRACE,這是用來擴充 {a,b,c,...} 來匹配 'a','b' 或 'c',...的。用法如下:foreach(glob($path.'/{*.txt,*.jpg,*.zip,...}', GLOB_BRACE) as $fileName){...}
至於完整的遍曆目錄下所有的指定檔案類型函數,我們可以看下面執行個體
遍曆檔案夾及子檔案夾所有檔案
代碼如下
<html>
<body>
<?php
function traverse($path = '.') {
$current_dir = opendir($path); //opendir()返回一個目錄控制代碼,失敗返回false
while(($file = readdir($current_dir)) !== false) { //readdir()返回開啟目錄控制代碼中的一個條目
$sub_dir = $path . DIRECTORY_SEPARATOR . $file; //構建子目錄路徑
if($file == '.' || $file == '..') {
continue;
} else if(is_dir($sub_dir)) { //如果是目錄,進行遞迴
echo 'Directory ' . $file . ':<br>';
traverse($sub_dir);
} else { //如果是檔案,直接輸出
echo 'File in Directory ' . $path . ': ' . $file . '<br>';
}
}
}
traverse('xxtt');
?>
</body>
</html>
一些常用的執行個體
代碼如下
<?php
$dir="E:/video"; //這裡輸入其它路徑
//PHP遍曆檔案夾下所有檔案
$handle=opendir($dir.".");
echo "檔案:<br>";
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..") {
echo $file; //輸出檔案名
}
}
closedir($handle);
?>
用了這段代碼遍曆所有檔案,幫我把所有檔案名稱存為一個數組。
代碼如下
<?php
$s=explode("/n",trim(`dir/b e://video`));
print_r($s);
?>
<?php
$dir="E:/video"; //這裡輸入其它路徑
//PHP遍曆檔案夾下所有檔案
$handle=opendir($dir.".");
echo "檔案:<br>";
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..") {
$file=$file.','; //輸出檔案名
$file=explode(',',$file);
}
}
print_r($file);//輸出的就是數組了
closedir($handle);
?>
<?php
$dir="."; //這裡輸入其它路徑
//PHP遍曆檔案夾下所有檔案
$handle=opendir($dir.".");
echo "檔案:<br>";
//定義用於隱藏檔名的數組
$array_file = array();
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..") {
$array_file[] = $file; //輸出檔案名
}
}
closedir($handle);
print_r("<pre>");
print_r($array_file);
print_r("</pre>");
?>