[英]Using scandir() to find folders in a directory (PHP)
我正在使用這個代碼:
$target = 'extracted/' . $name[0];
$scan = scandir($target);
掃描用於zip上傳的文件夾的目錄。 我希望能夠找到$target
文件夾中的所有文件夾,這樣我就可以刪除它們及其內容,只留下$target
目錄中的文件。
一旦我返回了文件夾的內容,我不知道如何區分文件夾和文件以便能夠刪除文件夾。
另外,我被告知rmdir()
函數無法刪除其中包含內容的文件夾,有什么方法嗎?
謝謝,本。
要確定您是否有文件夾或文件,請使用函數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 } }
$path = 'extracted'; // '.' for current
foreach (new DirectoryIterator($path) as $file) {
if ($file->isDot()) continue;
if ($file->isDir()) {
print $file->getFilename() . '<br />';
}
}
首先,rmdir()無法刪除包含內容的文件夾。 如果禁用安全模式,您可以使用以下方法。
exec("rm -rf folder/");
另請參閱is_dir()/ is_file()或更好的PHP SPL 。
$directories = scandir('images');
foreach($directories as $directory){
if($directory=='.' or $directory=='..' ){
echo 'dot';
}else{
if(is_dir($directory)){
echo $directory .'<br />';
}
}
}
一個更簡單,也許更快的版本
scandir會掃描整個目錄,可以手動過濾。
但如果你像我一樣懶,那就用glob吧
$scan = glob($target."/*",GLOB_ONLYDIR);
它將輸出目標所有目錄的數組。
獲取所有子文件夾中的所有文件
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
如果項目位於該目錄中,您還希望刪除它們。 rmdir不允許您刪除包含文件的目錄。 但是有一個簡單的解決方案。
array_map('unlink', glob($target.'/*/*'));
array_map('rmdir',glob($target."/*",GLOB_ONLYDIR));
首先,它將取消鏈接所有子目錄中的所有文件。
其次,它將刪除所有目錄,因為它們不包含任何文件。
如果你有子目錄,那么你應該添加另外兩行,如下所示:
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
快速而骯臟的方式:
$folders = glob("<path>/*", GLOB_ONLYDIR);
一個更通用,面向對象的解決方案,受到使用DirectoryIterator的早期答案的啟發,但稍微簡潔和通用:
$path = '<path>';
$folders = [];
foreach (new \DirectoryIterator($path) as $file)
{
if (!$file->isDot() && $file->isDir())
{
$folders[] = $file;
}
}
這是我用來解析檔案和目錄的一個函數
function scan_full_dir($dir,$child=false){
$dir_content_list = scandir($dir);
foreach($dir_content_list as $value)
{
if($value === '.' || $value === '..') {continue;}
// check if we have file
if(is_file($dir.'/'.$value)) {
echo '<br> File Name --> '.$value;
continue;
}
// check if we have directory
if (is_dir($dir.'/'.$value)) {
if(!$child){
echo '<br> parent --> '.$value;
}else{
echo '<br> child of '.$child.' --> '.$value;
}
scan_full_dir($dir.'/'.$value,$value);
}
}
}
輸出樣本
parent --> fonts
File Name --> standard
parent --> steps
child of steps --> pcb
File Name --> .attrlist.sum
File Name --> .profile.sum
File Name --> .stephdr.sum
File Name --> attrlist
child of pcb --> netlists
child of netlists --> cadnet
File Name --> .netlist.sum
File Name --> netlist
File Name --> profile
File Name --> stephdr
//掃描目錄
scan_full_dir('path/of/myfolder');
//掃描存檔而不打開它,支持的格式:gz,zip,tar和bz文件。
scan_full_dir('phar://uploads/youarchive.zip);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.