2009-03-03 85 views
29

我使用這個代碼peice的目錄中(PHP)的文件夾:使用SCANDIR()找到

$target = 'extracted/' . $name[0]; 
$scan = scandir($target); 

要掃描的使用ZIP上傳文件夾的目錄。我希望能夠找到我的$target文件夾中的所有文件夾,以便我可以刪除它們及其內容,只留下$target目錄中的文件。

一旦我已經返回文件夾的內容,我不知道如何區分文件夾和文件以便能夠刪除文件夾。

此外,我被告知,rmdir()函數不能刪除其中有內容的文件夾,有沒有辦法解決這個問題?

謝謝,本。

回答

3

首先,rmdir()無法刪除包含內容的文件夾。如果安全模式被禁用,您可以使用以下內容。

exec("rm -rf folder/"); 

另請看is_dir()/ is_file()或更好的PHP SPL

+0

您刪除功能工作一種享受! rm -rf實際上做了什麼?謝謝 – 2009-03-04 00:42:21

+0

對於任何想知道的人,`rm -rf`在目標目錄(文件夾/在這個例子中)使用選項`-r`(遞歸 - 遞歸地移除目標文件夾內的文件和文件夾)和` -f`(強制 - 不提示錯誤等,忽略不存在的文件)。基本上,它確保在刪除目標時處理目標文件夾內的所有文件和文件夾。一般來說,如果你在包含其他內容的文件夾上嘗試`rm`,它只會引發一個錯誤,說它不是空的。 [詳情請點擊這裏](http://www.tutorialspoint.com/unix_commands/rm.htm) – andyface 2014-03-11 12:57:57

55

要確定你是否有一個文件夾或文件使用的功能is_dir()is_file()

例如:

 
$path = 'extracted/' . $name[0]; 
$results = scandir($path); 

foreach ($results as $result) { 
    if ($result === '.' or $result === '..') continue; 

    if (is_dir($path . '/' . $result)) { 
     //code to use if directory 
    } 
} 
+2

這是非常棒的,完美的作品!如果($ result ==='。'或$ result ==='..')繼續;',請你介意解釋一下,我不明白這部分是做什麼的。再次感謝。 – 2009-03-04 00:27:49

+3

@Ben McRae:這是因爲scandir返回結果「。」和「..」作爲數組的一部分,並且在大多數情況下,您希望忽略這些結果,這就是爲什麼我將它作爲foreach的一部分包含在內 – 2009-03-04 23:08:08

2
$directories = scandir('images'); 
foreach($directories as $directory){ 
    if($directory=='.' or $directory=='..'){ 
     echo 'dot'; 
    }else{ 
      if(is_dir($directory)){ 
        echo $directory .'<br />'; 
      } 
    } 
} 

更簡單,也許更快的版本

36

不如使用DirectoryIterator

$path = 'extracted'; // '.' for current 
foreach (new DirectoryIterator($path) as $file) { 
    if ($file->isDot()) continue; 

    if ($file->isDir()) { 
     print $file->getFilename() . '<br />'; 
    } 
} 
1

scandir會掃描整個目錄,你可以手動過濾。

,但如果你是懶惰像我,然後用水珠

$scan = glob($target."/*",GLOB_ONLYDIR); 

,它會輸出目標的所有目錄的數組。

0

您還想刪除項目,如果他們在該目錄內。 rmdir不允許你刪除包含文件的目錄。但是有一個簡單的溶劑。

array_map('unlink', glob($target.'/*/*')); 
array_map('rmdir',glob($target."/*",GLOB_ONLYDIR)); 

首先它將取消所有子目錄中的所有文件的鏈接。
其次,它將刪除所有目錄,因爲它們不包含任何文件。

如果你有子子目錄,那麼你應該再添2號線這樣的:

array_map('unlink', glob($target.'/*/*/*')); //remove sub-sub-files 
array_map('rmdir',glob($target."/*/*",GLOB_ONLYDIR)); //remove sub-sub-directories 

array_map('unlink', glob($target.'/*/*')); //remove sub-files 
array_map('rmdir',glob($target."/*",GLOB_ONLYDIR)); //remove sub-directories 
0

快速和骯髒的方式:

$folders = glob("<path>/*", GLOB_ONLYDIR); 

更通用的和麪向對象解決方案,受以前使用DirectoryIterator的答案的啓發,但稍微簡潔一些:

$path = '<path>'; 
    $folders = []; 

    foreach (new \DirectoryIterator($path) as $file) 
    { 
     if (!$file->isDot() && $file->isDir()) 
     { 
      $folders[] = $file; 
     } 
    } 
0

要得到所有子中的所有文件,子文件

function myfunction($dir){ 

foreach ($dir as $dirname => $file) { 

if(is_dir($file) && $file != '.' && $file != '..') { 

    // echo $file; 
     $newDir = scandir($file); 
     myfunction($newDir); 

    }elseif($file !='.' && $file != '..'){ 

     echo "<br>File name is ---"; 
     echo $file; 
    } 

} // end foreach 


} //function ends 

$dirpass = scandir($mypath3); // set directory 
echo myfunction($dirpass); //  pass directory 

我們將得到的結果如下圖所示(PLZ忽略文件名)

File name is ----->index.PHP 
File name is -----> 100000045 Invoices Sales Magento Admin.png 
File name is -----> 100000142 Orders Sales Magento Admin(1).png 
File name is -----> 100000142 Orders Sales Magento Admin.png 
File name is ----->hrc-siberian-tiger-2-jpg_21253111.jpg 
File name is ----->images (3rd copy).jpeg 
File name is ----->images (4th copy).jpeg 
File name is ----->images (5th copy).jpeg 
File name is ----->images (another copy).jpeg 
File name is ----->images (copy).jpeg 
File name is ----->images.jpeg 
File name is ----->JPEG_example_JPG_RIP_100.jpg 
File name is ----->preload 
File name is ----->Stonehenge (3rd copy).jpg 
File name is ----->Stonehenge (4th copy).jpg 
File name is ----->Stonehenge (5th copy).jpg 
File name is ----->Stonehenge (another copy).jpg 
File name is ----->Stonehenge (copy).jpg 
File name is ----->Stonehenge.jpg