Hướng dẫn php rmdir directory not empty - thư mục php rmdir không trống

Tôi đang cố gắng xóa một thư mục bằng

function deleteDirectory($dir) {
    system('rm -rf -- ' . escapeshellarg($dir), $retval);
    return $retval == 0; // UNIX commands return zero on success
}
3, nhưng tôi đã nhận được thông báo 'thư mục không trống', vì nó vẫn có các tệp trong đó.

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

Hướng dẫn php rmdir directory not empty - thư mục php rmdir không trống

Sắc nét

6.4684 Huy hiệu vàng44 Huy hiệu bạc39 Huy hiệu đồng4 gold badges44 silver badges39 bronze badges

Đã hỏi ngày 31 tháng 10 năm 2009 lúc 8:22Oct 31, 2009 at 8:22

Hướng dẫn php rmdir directory not empty - thư mục php rmdir không trống

Zeckdudezeckdudezeckdude

15.4K42 Huy hiệu vàng135 Huy hiệu bạc184 Huy hiệu đồng42 gold badges135 silver badges184 bronze badges

1

Không có chức năng tích hợp để làm điều này, nhưng xem các nhận xét ở cuối 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 lựa chọn của bạn từ những người đó.

Đây là một cái có vẻ tử tế:

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);
}

Bạn chỉ có thể gọi

function deleteDirectory($dir) {
    system('rm -rf -- ' . escapeshellarg($dir), $retval);
    return $retval == 0; // UNIX commands return zero on success
}
4 nếu bạn muốn giữ mọi thứ đơn giản. Điều đó làm cho tập lệnh của bạn chỉ có Unix, vì vậy hãy cẩn thận với điều đó. Nếu bạn đi theo con đườ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
}

Đã trả lời ngày 31 tháng 10 năm 2009 lúc 8:26Oct 31, 2009 at 8:26

John Kugelmanjohn KugelmanJohn Kugelman

338K67 Huy hiệu vàng509 Huy hiệu bạc560 Huy hiệu Đồng67 gold badges509 silver badges560 bronze badges

1

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);
 }
}

John

Huy hiệu vàng 12K1190 Huy hiệu bạc157 Huy hiệu đồng11 gold badges90 silver badges157 bronze badges

Đã trả lời ngày 29 tháng 7 năm 2014 lúc 10:21Jul 29, 2014 at 10:21

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

Nếu trên Linux sử dụng:

function deleteDirectory($dir) {
    system('rm -rf -- ' . escapeshellarg($dir), $retval);
    return $retval == 0; // UNIX commands return zero on success
}
5 Nếu trên Windows sử dụng:
function deleteDirectory($dir) {
    system('rm -rf -- ' . escapeshellarg($dir), $retval);
    return $retval == 0; // UNIX commands return zero on success
}
6

Trong bài đăng trên (John Kugelman), tôi cho rằng trình phân tích cú pháp PHP sẽ tối ưu hóa scandir đó trong foreach nhưng có vẻ như tôi có thể có

function deleteDirectory($dir) {
    system('rm -rf -- ' . escapeshellarg($dir), $retval);
    return $retval == 0; // UNIX commands return zero on success
}
7 trong tuyên bố điều kiện
function deleteDirectory($dir) {
    system('rm -rf -- ' . escapeshellarg($dir), $retval);
    return $retval == 0; // UNIX commands return zero on success
}
8. Bạn cũng có thể chỉ thực hiện hai lệnh
function deleteDirectory($dir) {
    system('rm -rf -- ' . escapeshellarg($dir), $retval);
    return $retval == 0; // UNIX commands return zero on success
}
9 để xóa
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);
 }
}
0 và
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 thay vì luôn luôn kiểm tra vòng lặp.
You could also just do two
function deleteDirectory($dir) {
    system('rm -rf -- ' . escapeshellarg($dir), $retval);
    return $retval == 0; // UNIX commands return zero on success
}
9 commands to remove the
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);
 }
}
0 and
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 instead of always checking in the loop.

Đã trả lời ngày 31 tháng 10 năm 2009 lúc 8:49Oct 31, 2009 at 8:49

AntoniocsantoniocsAntonioCS

8.18718 Huy hiệu vàng63 Huy hiệu bạc91 Huy hiệu Đồng18 gold badges63 silver badges91 bronze badges

Không thể nghĩ ra một cách dễ dàng và hiệu quả hơn để làm điều đó hơn thế này

function removeDir($dirname) {
    if (is_dir($dirname)) {
        $dir = new RecursiveDirectoryIterator($dirname, RecursiveDirectoryIterator::SKIP_DOTS);
        foreach (new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST) as $object) {
            if ($object->isFile()) {
                unlink($object);
            } elseif($object->isDir()) {
                rmdir($object);
            } else {
                throw new Exception('Unknown object type: '. $object->getFileName());
            }
        }
        rmdir($dirname); // Now remove myfolder
    } else {
        throw new Exception('This is not a directory');
    }
}


removeDir('./myfolder');

Đã trả lời ngày 21 tháng 3 năm 2018 lúc 0:29Mar 21, 2018 at 0:29

Hướng dẫn php rmdir directory not empty - thư mục php rmdir không trống

Mưa mưaRain

3.1192 Huy hiệu vàng18 Huy hiệu bạc37 Huy hiệu đồng2 gold badges18 silver badges37 bronze badges

Trường hợp của tôi có khá nhiều thư mục khó khăn (tên chứa các ký tự đặc biệt, làm tổ sâu, v.v.) và các tệp ẩn tạo ra các lỗi "thư mục không trống" với các giải pháp được đề xuất khác. Vì một giải pháp chỉ dành cho UNIX 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;
}

Đã trả lời ngày 9 tháng 5 năm 2016 lúc 20:39May 9, 2016 at 20:39

2

Đã có rất nhiều giải pháp, vẫn là một khả năng khác có ít mã sử dụng chức năng mũi tên PHP:

function rrmdir(string $directory): bool
{
    array_map(fn (string $file) => is_dir($file) ? rrmdir($file) : unlink($file), glob($directory . '/' . '*'));

    return rmdir($directory);
}

Đã trả lời ngày 3 tháng 12 năm 2021 lúc 11:25Dec 3, 2021 at 11:25

Đâ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);

Đã trả lời ngày 6 tháng 4 năm 2016 lúc 5:34Apr 6, 2016 at 5:34

NamannamanNaman

Huy hiệu đồng 3111 bronze badge

Từ http://php.net/manual/en/function.rmdir.php#91797

Chức năng GLOB không trả về các tệp ẩn, do đó scandir có thể hữu ích hơn, khi cố gắng xóa một cây đệ quy.


Đã trả lời ngày 19 tháng 2 năm 2019 lúc 9:49Feb 19, 2019 at 9:49

Hướng dẫn php rmdir directory not empty - thư mục php rmdir không trống

Mykola rất Hamykola rấtMykola Veryha

4131 Huy hiệu vàng4 Huy hiệu bạc11 Huy hiệu đồng1 gold badge4 silver badges11 bronze badges

Hãy thử chức năng tiện dụng 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);
}

Đã trả lời ngày 8 tháng 4 năm 2016 lúc 15:00Apr 8, 2016 at 15:00

Kenorbkenorbkenorb

Phù bằng vàng 145K7676 gold badges656 silver badges714 bronze badges

Tôi đã không đến để xóa một thư mục vì PHP nói tôi không trống. Nhưng nó đã được. Chức năng của Naman là giải pháp tốt để hoàn thành của tôi. Vì vậy, đâ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);
                    }
                }
            }
        }
    }
}

function deleteDir($dir) {

    foreach(glob($dir . '/' . '*') as $file) {
        if(is_dir($file)){


            deleteDir($file);
        } else {

          unlink($file);
        }
    }
    emptyDir($dir);
    rmdir($dir);
}

Vì vậy, để xóa một thư mục và đệ quy nội dung của nó:

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

Hướng dẫn php rmdir directory not empty - thư mục php rmdir không trống

Đã trả lời ngày 24 tháng 1 năm 2019 lúc 22:31Jan 24, 2019 at 22:31

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

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

Hướng dẫn php rmdir directory not empty - thư mục php rmdir không trống

Đã trả lời ngày 21 tháng 4 năm 2016 lúc 17:05Apr 21, 2016 at 17:05

Hướng dẫn php rmdir directory not empty - thư mục php rmdir không trống

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

Đã trả lời ngày 26 tháng 9 năm 2021 lúc 16:36Sep 26, 2021 at 16:36

Hướng dẫn php rmdir directory not empty - thư mục php rmdir không trống

Làm thế nào để xóa thư mục không trống trong PHP?

Hàm rmdir () trong PHP là một hàm sẵn được sử dụng để loại bỏ một thư mục trống.rmdir() function in PHP is an inbuilt function which is used to remove an empty directory.

Làm cách nào để xóa một thư mục không trống?

Để xóa vĩnh viễn một thư mục trong Linux, hãy sử dụng lệnh rmdir hoặc rm: Đối với các thư mục trống, hãy sử dụng rmdir [dirname] hoặc rm -d [dirname] cho các thư mục không trống, hãy sử dụng rm -r [dirname] ... Cách xóamột thư mục trong Linux ..

Làm cách nào để xóa một thư mục không trống trong CMD?

Để xóa một thư mục không trống, hãy sử dụng lệnh RM với tùy chọn -R để xóa đệ quy.Hãy rất cẩn thận với lệnh này, bởi vì sử dụng lệnh RM -R sẽ xóa không chỉ mọi thứ trong thư mục được đặt tên, mà còn mọi thứ trong các thư mục con của nó.use the rm command with the -r option for recursive deletion. Be very careful with this command, because using the rm -r command will delete not only everything in the named directory, but also everything in its subdirectories.

Làm thế nào để bạn làm trống một thư mục trong PHP?

Xác thực tệp trong khi kiểm tra xem thư mục tệp có dấu chấm hay không.Sử dụng tham chiếu phương thức GetPathName, xóa tệp bằng phương thức Unlink () ...
Tạo danh sách các tệp bằng phương thức glob () ..
Lặp lại danh sách các tệp ..
Kiểm tra xem tên của các tệp có hợp lệ không ..
Xóa tệp bằng phương thức Unlink () ..