2009-10-31 33 views
34

Tôi đang cố xóa thư mục có số rmdir nhưng tôi đã nhận được thư 'Thư mục không trống' vì thư này vẫn có tệp trong đó.Làm cách nào để xóa thư mục không trống?

Tôi có thể sử dụng chức năng nào để xóa thư mục với tất cả các tệp trong đó?

+0

Có thể trùng lặp [Làm cách nào đệ quy thư mục và toàn bộ nội dung + dir phụ) trong PHP?] (http://stackoverflow.com/questions/3338123/how-do-i-recursively-delete-a-directory-and-its-entire-contents-files-sub-dir) – MaxiWheat

Trả lời

78

Không có chức năng tích hợp để thực hiện việc này, nhưng hãy xem các nhận xét ở dưới cùng của http://us3.php.net/rmdir. Một số người bình luận đã đăng các chức năng xóa thư mục đệ quy của riêng họ. Bạn có thể lấy của bạn từ những người.

Dưới đây là one that looks decent:

function deleteDirectory($dir) { 
    if (!file_exists($dir)) { 
     return true; 
    } 

    if (!is_dir($dir)) { 
     return unlink($dir); 
    } 

    foreach (scandir($dir) as $item) { 
     if ($item == '.' || $item == '..') { 
      continue; 
     } 

     if (!deleteDirectory($dir . DIRECTORY_SEPARATOR . $item)) { 
      return false; 
     } 

    } 

    return rmdir($dir); 
} 

Edit: Bạn chỉ có thể gọi rm -rf nếu bạn muốn giữ cho mọi thứ đơn giản. Điều đó làm cho kịch bản của bạn chỉ có UNIX, vì vậy hãy cẩn thận về điều đó. Nếu bạn đi tuyến đường đó, tôi sẽ thử một cái gì đó như:

function deleteDirectory($dir) { 
    system('rm -rf ' . escapeshellarg($dir), $retval); 
    return $retval == 0; // UNIX commands return zero on success 
} 
+8

Khi nói đến PHP, ** luôn luôn ** kiểm tra hướng dẫn trực tuyến và các bình luận. Nói chung, nó đảm bảo rằng ai đó đã có vấn đề đầu tiên và nhận xét ở đó. –

+0

Tôi chọn cái này: $ path = "/ path/to/empty"; $ cmd = "rm -rf $ path"; '$ cmd'; Có gì không ổn với điều đó? – zeckdude

+2

+1 cho escapeshellarg() cho an ninh – namespaceform

5

Bạn luôn có thể thử sử dụng lệnh hệ thống.

Nếu sử dụng Linux: rm -rf /dir Nếu trên cửa sổ sử dụng: rd c:\dir /S /Q

Trong bài viết ở trên (John Kugelman) Tôi cho rằng phân tích cú pháp PHP sẽ tối ưu hóa mà scandir trong foreach nhưng nó chỉ có vẻ không đúng với tôi để có scandir trong tuyên bố điều kiện foreach.
Bạn cũng có thể thực hiện hai lệnh array_shift để xóa ... thay vì luôn kiểm tra trong vòng lặp.

2
function rrmdir($dir) { 
    if (is_dir($dir)) { 
    $objects = scandir($dir); 
    foreach ($objects as $object) { 
     if ($object != "." && $object != "..") { 
     if (filetype($dir."/".$object) == "dir"){ 
      rrmdir($dir."/".$object); 
     }else{ 
      unlink($dir."/".$object); 
     } 
     } 
    } 
    reset($objects); 
    rmdir($dir); 
    } 
} 
1

Dưới đây là những gì tôi đã sử dụng:

function emptyDir($dir) { 
    if (is_dir($dir)) { 
     $scn = scandir($dir); 
     foreach ($scn as $files) { 
      if ($files !== '.') { 
       if ($files !== '..') { 
        if (!is_dir($dir . '/' . $files)) { 
         unlink($dir . '/' . $files); 
        } else { 
         emptyDir($dir . '/' . $files); 
         rmdir($dir . '/' . $files); 
        } 
       } 
      } 
     } 
    } 
} 

$dir = 'link/to/your/dir'; 
emptyDir($dir); 
rmdir($dir); 
0

Hãy thử chức năng tiện dụng như sau:

/** 
* Removes directory and its contents 
* 
* @param string $path Path to the directory. 
*/ 
function _delete_dir($path) { 
    if (!is_dir($path)) { 
    throw new InvalidArgumentException("$path must be a directory"); 
    } 
    if (substr($path, strlen($path) - 1, 1) != DIRECTORY_SEPARATOR) { 
    $path .= DIRECTORY_SEPARATOR; 
    } 
    $files = glob($path . '*', GLOB_MARK); 
    foreach ($files as $file) { 
    if (is_dir($file)) { 
     _delete_dir($file); 
    } else { 
     unlink($file); 
    } 
    } 
    rmdir($path); 
} 
0

Với chức năng này, bạn sẽ có thể xóa bất kỳ tập tin hoặc thư mục

function deleteDir($dirPath) 
{ 
    if (!is_dir($dirPath)) { 
     if (file_exists($dirPath) !== false) { 
      unlink($dirPath); 
     } 
     return; 
    } 

    if ($dirPath[strlen($dirPath) - 1] != '/') { 
     $dirPath .= '/'; 
    } 

    $files = glob($dirPath . '*', GLOB_MARK); 
    foreach ($files as $file) { 
     if (is_dir($file)) { 
      deleteDir($file); 
     } else { 
      unlink($file); 
     } 
    } 

    rmdir($dirPath); 
} 
1

Trường hợp của tôi có khá nhiều thư mục phức tạp (na mes chứa các ký tự đặc biệt, làm tổ sâu, vv) và các tệp ẩn đã tạo ra lỗi "Thư mục không trống" với các giải pháp được đề xuất khác. Vì giải pháp Unix chỉ là không thể chấp nhận được, tôi đã thử nghiệm cho đến khi tôi đến giải pháp sau (hoạt động tốt trong trường hợp của tôi):

function removeDirectory($path) { 
    // The preg_replace is necessary in order to traverse certain types of folder paths (such as /dir/[[dir2]]/dir3.abc#/) 
    // The {,.}* with GLOB_BRACE is necessary to pull all hidden files (have to remove or get "Directory not empty" errors) 
    $files = glob(preg_replace('/(\*|\?|\[)/', '[$1]', $path).'/{,.}*', GLOB_BRACE); 
    foreach ($files as $file) { 
     if ($file == $path.'/.' || $file == $path.'/..') { continue; } // skip special dir entries 
     is_dir($file) ? removeDirectory($file) : unlink($file); 
    } 
    rmdir($path); 
    return; 
} 
+0

Để mở rộng nhu cầu về preg_replace, nó là cần thiết vì một số thư mục (với các ký tự đặc biệt) sẽ bỏ qua các thư mục con đã tồn tại rõ ràng. Tôi tìm thấy các lưu ý preg_replace từ một bình luận trong php.net tài liệu cho glob(), nơi người khác đấu tranh hàng giờ với cùng một vấn đề. –

+0

Đây là người duy nhất có thể giải quyết vấn đề của tôi quá +1, cảm ơn – Franco

Các vấn đề liên quan