Primesc o eroare „este un director” atunci când încerc să dezleg directorul de legătură (Programare, Php)

thinkofacard a intrebat.
a intrebat.

Încerc să creez o funcție care va rula periodic pentru a șterge toate dosarele vechi „user” care nu au un utilizator activ. Aceasta este funcția pe care o am:

function delete_temp_user_files() {
    $dir = $_SERVER['DOCUMENT_ROOT'] . "/users/";
    $dir_files = array();
    $dir_files = scandir($dir);
    foreach ($dir_files as $username) {
        if ($username == "." || $username == "..") continue;
        if (!user_exist($username)) {
            $dir1 = $_SERVER['DOCUMENT_ROOT'] . "/users/" . $username;
            if (!is_dir($dir1)) continue;
            if (file_exists($dir1)) unlink($dir1);
        }
    }
}

Dar când încearcă să șteargă directorul primesc eroarea „Warning: unlink(/path/to/users/delete1/): Este un director în /page.php pe linia…” Știu că directorul există pentru că îl pot vedea în director și oricum l-a găsit folosind scandir().

Folosesc unlink pentru a șterge aceste aceleași directoare în alte scripturi și funcționează bine. Directoarele nu sunt goale, așa că nu pot folosi rmdir().

Nu sunt familiarizat cu permisiunile sau ceva de genul ăsta, este vreun fel de problemă cu asta? Și trebuie să-mi fac griji cu privire la permisiuni dacă folosesc doar scripturi PHP pentru a șterge fișiere și foldere (cum ar fi atunci când utilizatorul face clic pe butonul de ștergere care rulează scriptul pe care l-am scris)?

UPDATE:

După ce am răscolit internetul, am găsit în sfârșit cum să șterg un director și nu este ușor lol Adaugă această funcție în funcția anterioară și funcționează!

function delete_dir($directory) {
    foreach(glob("{$directory}/*") as $file)
    {
        if(is_dir($file)) { 
            delete_dir($file);
        } else {
            unlink($file);
        }
    }
    rmdir($directory);
}

Comentarii

  • nu puteți șterge folderele înainte de fișiere în PHP. eliminați fișierele, apoi eliminați folderul (folderele) – dezlegarea este pentru fișiere, nu pentru foldere – ref: php.net/manual/en/function.unlink.phpphp.net/manual/en/function.rmdir.phpphp.net/manual/en/function.chmod.php –  > Por Funk Forty Niner.
  • s-ar putea totuși, să puteți realiza acest lucru prin ftp în schimb, dar nu pot confirma acest lucru acum. Editare: o soluție găsită prin ftp stackoverflow.com/a/8595188, dacă doriți vreodată să mergeți pe această cale. –  > Por Funk Forty Niner.
  • Pentru codul actualizat; Dacă aveți un server linux, puteți încerca exec('rm -R ' . $dirname). exec vă permite să executați comenzi shell. php.net/manual/ro/function.exec.php –  > Por Kapil Sharma.
  • Notă către autor actualizare: glob nu returnează fișierele ascunse, prin urmare este mai bine să folosiți scandir. – utilizator3845133
3 răspunsuri
Kapil Sharma

unlink este utilizat pentru a șterge fișiere, utilizați rmdir

Rețineți că trebuie să ștergeți mai întâi toate fișierele din director.

De asemenea, codul dvs. este foarte periculos. Să presupunem că, în timp, aveți 100.000 de utilizatori, deci veți avea 100.000 de dosare. Vă puteți imagina cât timp va dura acest rând?

foreach ($dir_files as $username) {

Vă rugăm să vă gândiți la o cale alternativă.

O modalitate bună este să nu ștergeți utilizatorii din baza de date. Găsiți utilizatorii care nu s-au conectat de 6 luni (să zicem) și dezactivați-i. În acest fel, bucla dvs. este mai mică.

Comentarii

  • Da, asta am spus și eu…. –  > Por Funk Forty Niner.
  • @Fred-ii- da, este același lucru. Când am început să scriu răspunsul, comentariul tău nu era acolo. Singura diferență, eu am dat răspunsul (pentru că era direct) și tu ai postat comentariul. –  > Por Kapil Sharma.
dlegall

Există o funcție dată pe rmdir pagina de documentație :

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

Cu siguranță vă va face viața mai ușoară.

Jonjie

Știu că este un răspuns târziu, dar am rezolvat problema verificând dacă fișierul există sau nu.

Folosesc baza de date pentru calea fișierului. Așa că puteți încerca un cod de exemplu mai jos.

if(!empty($course->picture)){
  // unlink here
}

Tags: