2009-08-26 11 views
27

Potrzebuję usunąć folder z zawartością za pomocą PHP. rmdir() i unlink() usunąć puste foldery, ale nie można usunąć folderów, które mają zawartość.Jak usunąć folder z zawartością za pomocą PHP

+6

@@ Maerlyn: I zostały zaksięgowane to pytanie w dniu sie 26, 2009. Duplikat jednej której wspomniano został opublikowany 28 lipca 2010 r. Wierzę, że wiesz co robić TERAZ ... Zanim coś zrobisz, sprawdź raz jeszcze. – Fero

Odpowiedz

80

Ta funkcja pozwala usunąć dowolny folder (tak długo, jak to jest zapisywalny) i jego plików i podkatalogów.

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = array_diff(scandir($path), array('.', '..')); 

     foreach ($files as $file) 
     { 
      Delete(realpath($path) . '/' . $file); 
     } 

     return rmdir($path); 
    } 

    else if (is_file($path) === true) 
    { 
     return unlink($path); 
    } 

    return false; 
} 

Albo bez rekursji przy użyciu RecursiveDirectoryIterator:

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST); 

     foreach ($files as $file) 
     { 
      if (in_array($file->getBasename(), array('.', '..')) !== true) 
      { 
       if ($file->isDir() === true) 
       { 
        rmdir($file->getPathName()); 
       } 

       else if (($file->isFile() === true) || ($file->isLink() === true)) 
       { 
        unlink($file->getPathname()); 
       } 
      } 
     } 

     return rmdir($path); 
    } 

    else if ((is_file($path) === true) || (is_link($path) === true)) 
    { 
     return unlink($path); 
    } 

    return false; 
} 
+2

Świetna metoda, człowiek . Używałem bardzo prostego polecenia: , ale niestety niektóre serwery nie zezwalają na polecenie systemowe, więc twoje (wybrałem pierwszy) jest bardzo dobrym i prostym zamiennikiem. Dzięki bracie. –

+1

Czy to też działa dla ścieżek względnych? Powiedzmy, że pełna ścieżka to "/ var/www/html/folder_and_files_to_delete /" Skrypt usuwania znajduje się w "/var/www/html/delete_folders_and_files.php". Czy mogę po prostu użyć "folder_and_files_to_delete" jako ścieżki? – yoano

+0

Jak, najlepsza odpowiedź – mghhgm

3

Musisz pętli wokół zawartości folderu (w tym zawartość wszelkich podfolderów) i usunąć je najpierw.

Jest to przykład tutaj: http://lixlpixel.org/recursive_function/php/recursive_directory_delete/

Bądź ostrożny z tym !!!

+3

Jeśli masz zamiar głosować w dół, odpowiedz proszę, dlaczego. – Fenton

+3

Prawdopodobnie ktoś tutaj próbuje podnieść swoją odpowiedź na szczyt. +1 do przesunięcia. – ryeguy

+0

Dzięki ryeguy i innym! – Fenton

0

Zawsze można oszukać i zrobić shell_exec("rm -rf /path/to/folder");

+2

Chyba że jesteś w systemie Windows :) –

+0

Nie zaleca się w ogóle do produkcji. – Volomike

+2

@Volomike: Dlaczego? Jest to prawie na pewno szybsze niż rozwiązanie php. – ryeguy

1

Trzeba będzie usunąć wszystkie pliki rekurencyjnie. Istnieje wiele przykładowe funkcje w komentarzach na stronie rmdir ręcznej:

http://www.php.net/rmdir

+0

Mam nadzieję, że rmdir usunie tylko folder, który nie ma zawartości. jeśli ma zawartość, nie usunie folderu. – Fero

+0

To jest dokładnie w porządku Fero - rmdir nie usunie katalogu z zawartością, dlatego najpierw musisz usunąć jakąś zawartość, jeśli chcesz pozbyć się katalogu (włączając w to zawartość podkatalogów) – Fenton

1

Nie ma jednej funkcji wbudowanych w PHP, która pozwala na to, musisz napisać własne z rmdir i rozłączyć.

Przykładem (zaczerpnięte z komentarzem na php.net docs):

<? 
// ensure $dir ends with a slash 
function delTree($dir) { 
    $files = glob($dir . '*', GLOB_MARK); 
    foreach($files as $file){ 
     if(substr($file, -1) == '/') 
      delTree($file); 
     else 
      unlink($file); 
    } 
    rmdir($dir); 
} 
?> 
+1

Co to jest GLOB_MARK? – Randell

+0

@Randell: GLOB_MARK - dodaje ukośnik do każdego zwróconego katalogu. –

3

Oto skrypt, który zrobi to, czego potrzebujesz:

/** 
* Recursively delete a directory 
* 
* @param string $dir Directory name 
* @param boolean $deleteRootToo Delete specified top-level directory as well 
*/ 
function unlinkRecursive($dir, $deleteRootToo) 
{ 
    if(!$dh = @opendir($dir)) 
    { 
     return; 
    } 
    while (false !== ($obj = readdir($dh))) 
    { 
     if($obj == '.' || $obj == '..') 
     { 
      continue; 
     } 

     if ([email protected]($dir . '/' . $obj)) 
     { 
      unlinkRecursive($dir.'/'.$obj, true); 
     } 
    } 

    closedir($dh); 

    if ($deleteRootToo) 
    { 
     @rmdir($dir); 
    } 

    return; 
} 

mam go od php.net i działa .

-3

Być może lepszym rozwiązaniem jest użycie rm (jeśli jesteś pod Linuksem). byłoby to mniej więcej tak ($root powinien być zawsze ustawiony na swojej TMP directory aby zapobiec usuwanie ważnych plików!):

function remove($dir) { 

    $root = $_SERVER['DOCUMENT_ROOT'].'/tmp/'; 

    if (is_dir($root.$dir)) { 

     exec('rm -rf '.$root.$dir); 

    } 

} 
+4

remove ("/") ... sprawi, że wszyscy będą szczęśliwi :) –

+3

Yikes. Należy unikać poleceń powłoki. – Volomike

+1

USUWANIE PLIKÓW PODOBNYCH W APLIKACJI INTERNETOWEJ MUSI BYĆ UNIKNIONY. PODANIE WZGLĘDNYCH ŚCIEŻEK MOŻE USUNĄĆ WSZYSTKIE PLIKI W SYSTEMIE, JEŚLI UŻYTKOWNIK APLIKACJI MA ZGODĘ. – ArunaFromLK

Powiązane problemy