Avatar billede webcreator Nybegynder
06. december 2003 - 19:11 Der er 24 kommentarer og
1 løsning

Slet mappe med filer og undermapper (recursive)

Hej.

Jeg ønsker at kunne fjerne et helt bibliotek indeholdende filer, undermapper osv.

Jeg har nedenstående kode, men vil høre, om der findes bedre/alternativer til den metode jeg bruger.

Er løsningen i øvrigt sikker nok ? Skulle jo nødig have slettet forkerte filer :)
Avatar billede googolplex Novice
06. december 2003 - 19:14 #1
Jeg tror ikke den kode fjerne ret meget :P
Avatar billede webcreator Nybegynder
06. december 2003 - 19:15 #2
Ups ;)

function dele($dir) {
           
            chmod($dir,0777);
           
            if (is_dir($dir)) {
               
                $handle = opendir($dir);
           
                  while($filename = readdir($handle)) {
                   
                    if ($filename != "." && $filename != "..") {
                       
                    delete($file."/".$filename);
               
                }           
            }
           
            closedir($handle);
           
            rmdir($file);
           
            } else {
                unlink($file);
            }
       
        }
Avatar billede webcreator Nybegynder
06. december 2003 - 19:15 #3
Hm, indrykning er ikke så fedt på eksperten :)
Avatar billede Slettet bruger
06. december 2003 - 19:16 #4
Tjae, den ligner jo meget den jeg bruger:

function deldir($dir){
  $current_dir = opendir($dir);
  while($entryname = readdir($current_dir)){
    if(is_dir("$dir/$entryname") and ($entryname != "." and $entryname!="..")){
        deldir("${dir}/${entryname}");
    }elseif($entryname != "." and $entryname!=".."){
        unlink("${dir}/${entryname}");
    }
  }
  closedir($current_dir);
  rmdir(${dir});
}
Avatar billede webcreator Nybegynder
06. december 2003 - 19:19 #5
Hm, har din nogen fordele frem for min ?
Avatar billede Slettet bruger
06. december 2003 - 19:22 #6
Ikke umiddelbart, mit kan ikke slettet filer der ikke er uploadet via PHP. bare en sikkerhedsfeature ;)
Avatar billede webcreator Nybegynder
06. december 2003 - 19:23 #7
Ah, smart. Hvordan tjekkes det ?
Avatar billede Slettet bruger
06. december 2003 - 19:29 #8
Jamen det tjekkes såmænd ikke, jeg CHMOD'er bare ikke filerne, så kan man ikke slette dem (altså hvis serveren er sat korrekt op og er en UNIX maskine)
Avatar billede webcreator Nybegynder
06. december 2003 - 19:30 #9
Aaah, ok. På dén måde :)
Avatar billede jakoba Nybegynder
06. december 2003 - 20:06 #10
webcreator >> een fejl ved din er at  $file  aldrig får en værdi (jeg gætter på du har omdøbt den parameter funktionen får og glemt at ændre navnet indeni funktionen)
Avatar billede webcreator Nybegynder
06. december 2003 - 20:06 #11
Yep, og det har jeg faktisk siden fået rettet. Men tak alligevel :)
Avatar billede jakoba Nybegynder
06. december 2003 - 20:12 #12
og dit kald til closedir skal ind i if-sætningen så du ikke prøver at lukke når du aldrig har åbnet.
Avatar billede webcreator Nybegynder
06. december 2003 - 20:16 #13
Ja, det var nok en smart ting. Tak :)
Avatar billede jakoba Nybegynder
06. december 2003 - 20:17 #14
din linie
            } else {
jar ikke nogen  if ( ... ) {
som den hører til. mon ikke du mener:

function dele($dir) {
         
            chmod($dir,0777);
         
            if (is_dir($dir)) {            // det er en mappe
             
                $handle = opendir($dir);
         
                  while($filename = readdir($handle)) {
                 
                    if ($filename != "." && $filename != "..") {
                     
                    delete($dir."/".$filename);
             
                }         
                closedir($handle);    // flyttet ind i if

                unlink($dir);        // nu kan vi slette selve mappen

            } else {                    // det er IKKE en mappe
         
                rmdir($file);        // så vi sletter bare den fil
         
            }
     
        }

mvh JakobA
Avatar billede jakoba Nybegynder
06. december 2003 - 20:19 #15
og funktionen skal så hedde delete (tilføjet 'te') så den kalder sig selv rekursivt.
Avatar billede webcreator Nybegynder
06. december 2003 - 20:21 #16
Jamen den har da også netop IF'en : if (is_dir($dir))
Avatar billede webcreator Nybegynder
06. december 2003 - 20:21 #17
Oh, kan da godt se, at der er noget galt nu..
Avatar billede jakoba Nybegynder
06. december 2003 - 20:22 #18
Skod. jeg troede på dine indrykninger, men du har jo glemt indrykning i den indre if sætning

function delete($dir) {
       
            chmod($dir,0777);
       
            if (is_dir($dir)) {            // det er en mappe
           
                $handle = opendir($dir);
       
                  while($filename = readdir($handle)) {
               
                    if ($filename != "." && $filename != "..") {
                   
                      delete($dir."/".$filename);
                    }
           
                }       
                closedir($handle);    // flyttet ind i if

                unlink($dir);        // nu kan vi slette selve mappen

            } else {                    // det er IKKE en mappe
       
                rmdir($dir);        // så vi sletter bare den fil
       
            }
   
        }
Avatar billede webcreator Nybegynder
06. december 2003 - 20:23 #19
Yep, også lige det jeg studsede over :)
Avatar billede jakoba Nybegynder
06. december 2003 - 20:27 #20
Dooh.  ja du har helt ret. det var bare de indrykninger jeg snublede rundt i. Din oprindelige funktion burde faktisk virke, når blot $file laves til $dir og funktions navnet ændres

function delete($dir) {                // ændret navn så det passer med *2*
         
            chmod($dir,0777);
         
            if (is_dir($dir)) {
             
                $handle = opendir($dir);
         
                while($filename = readdir($handle)) {
                 
                    if ($filename != "." && $filename != "..") {
                     
                      delete($dir."/".$filename);    // *2* 
             
                    }         
                }
         
                closedir($handle);
         
                rmdir($dir);
         
            } else {

                unlink($dir);
            }
     
        }
Avatar billede webcreator Nybegynder
06. december 2003 - 20:43 #21
Godt fungere det altså ikke. Hvis jeg angiver et dir, som ikke eksisterer, så fjernes en forkert mappe.
Avatar billede webcreator Nybegynder
06. december 2003 - 20:43 #22
Og den fjerner ikke mapper med indhold.
Avatar billede webcreator Nybegynder
06. december 2003 - 20:44 #23
Jeg har angivet mit dir til : mappe/sub-mappe
Måske det skal være : /mappe/sub-mappe/  ?!
Avatar billede webcreator Nybegynder
06. december 2003 - 20:53 #24
Sorry, jeg var lidt for hurtig. Tror jeg skal kigge lidt mere på min kode inden jeg brokker mig :)
Avatar billede webcreator Nybegynder
20. december 2003 - 23:22 #25
Tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester