PHP-hjälp - Radera mapp med filer i

Trädvy Permalänk
Medlem
Plats
Karlshamn
Registrerad
Jun 2009

PHP-hjälp - Radera mapp med filer i

Hej

Jag behöver med hjälp av PHP-kod radera en mapp som innehåller bilder.

Har hittat rmdir() men den kräver ju att mappen är tom. Jag försökte då tömma mappen med unlink() men jag lyckas inte få det att funka.

Både filerna och mapparna är kvar.

Finns det ingen kod som i en kodrad kan radera en mapp samt filerna och mapparna som ligger i den?

$path = $_POST['path'];
$dir = opendir($path);

while (($file = readdir($dir)) !== false)
{

if($file == "index.php")
continue;
if($file == ".")
continue;
if($file == "..")
continue;

unlink($file);
}

if(rmdir($path))
{
echo "Albumet har raderats!<br />";
}

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Apr 2003

Ursäkta om jag felspekulerar, men får man inget felmeddelane om man kör rmdir utan att closedir innan?

Hur kan syltkakor överleva i det vilda utan ögon?

Trädvy Permalänk
Medlem
Registrerad
Sep 2005

du kan ju bara köra en shell_exec() eller liknande om du har linux, kanske även i windows (inte testat så vet ej)

då kan du köra nåt i stil med shell_exec(rm -R mappen)

kanske är helt ute o cycklar klockan är 02.00 och jag är trött

Trädvy Permalänk
Medlem
Plats
Huddinge, Stockholm
Registrerad
Jan 2003
Citat:

if($file == "index.php")
continue;

Om index.php finns där så kommer inte mappen gå att radera.

Hittade följande funktion på php.net bland kommentarerna:

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

Den ser ut att fungera. Kommer att ta bort mappen som specificerats, samt allt som finns i den (mappar och filer). Som det står ovanför funktionen så ska mappen avslutas med ett /.

Trädvy Permalänk
Medlem
Plats
Karlshamn
Registrerad
Jun 2009
Citat:

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

Får inte denna att funka.
I variabeln $dir ska man väll ange sökvägen antar jag?

Jag får sökvägen "foto/blandat/testalbum/" när jag skriver ut den och den slutar med ett "/" som jag tror det ska va.

Det är alltså mappen "testalbum" som ska raderas.

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Maj 2007

Det är antagligen så att php inte hittar mappen. Det finns två sätt att ange en sökväg till en mapp, relativ eller absolut. En relativ sökväg utgår ifrån den mapp där skriptet körs ifrån och kan då set ut t.ex:

undermapp/undermapp/mappToBeDelete
../../mapp/mappToBeDeleted

Absoluta sökvägar ser ut såhär och är det idiotsäkra sättet att hitta rätt.
/harddrive1/users/username/home/path/to/file/deleteMe
C:\path\to\file\on\windows\harddrive

För att testa om du har rätt sök väg kan du testa något liknande

if (file_exists($dir) { if (is_writable($dir)) { echo "Can delete the file"; } else { echo "Wrong permissions"; } } else { echo "Wrong path: ".$dir; }

Trädvy Permalänk
Medlem
Plats
Karlshamn
Registrerad
Jun 2009
Citat:

if (file_exists($dir) { if (is_writable($dir)) { echo "Can delete the file"; } else { echo "Wrong permissions"; } } else { echo "Wrong path: ".$dir; }

Efter att ha lagt till en parentes i första if-satsen så funkade koden och jag fick då resultatet "Can delete the file" så det verkar ju fungera som det ska.

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Maj 2007

Du får inga felmeddelanden från någon av funktioner (unlink eller rmdir)?
Har den tagit bort någon fil i någon undermapp eller är allt kvar? För att den skall kunna ta bort en mapp behöver den kunna ta bort ALLA filer i undermapparna, dvs scriptet måste har rätt rättigheter för att göra det. Kan det vara något av det som spökar?

För att testa detta kan du testa något sånt här:

function permCheck($dir) { $files = glob( $dir . '*', GLOB_MARK ); foreach ($files as $file) { if( substr( $file, -1 ) == '/' ) permCheck( $file ); else permission( $file ); } permission($dir); } function permission($file) { if(file_exists($file)) { if (is_writable($file)) echo "Can delete the file"; else echo "Wrong permissions"; } else { echo "Wrong path: ".$file; } }

Trädvy Permalänk
Medlem
Plats
Karlshamn
Registrerad
Jun 2009

Den koden skrev tyvärr inte ut något alls hehe

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Maj 2007

Jag skulle föreslå att du slår på felmeddelande-rapportering. Detta kan du göra i din php.ini fil eller direkt i koden genom att skriva:

error_reporting(E_ALL);

Högst upp i filen (innanför php-taggar)

Trädvy Permalänk
Medlem
Plats
Karlshamn
Registrerad
Jun 2009

Tyvärr jag får inte några nya resultat med den kodraden heller.
Nu börjar jag tappa hoppet om att detta ska börja fungera ^^ haha

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Maj 2007

Sitter du på ett windows eller unix-system?

Trädvy Permalänk
Medlem
Plats
Karlshamn
Registrerad
Jun 2009

Jag sitter personligen i windows och kodar.
Själva sidan ligger hos one.com så är inte säker på vad de gör för system.

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Maj 2007

Okej, hos one.com ska du kunna sätta på error-reporting i kontrollpanelen om jag inte minns fel.

Testa att editera den här raden i koden, tänkte i på det förrut. Ska inte ställa till några problem på one men om du sitter på windows kan det gör det.

if( substr( $file, -1 ) == DIRECTORY_SEPARATOR )

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Dec 2002
Citat:

Ursprungligen inskrivet av Dynamo
Jag skulle föreslå att du slår på felmeddelande-rapportering. Detta kan du göra i din php.ini fil eller direkt i koden genom att skriva:

error_reporting(E_ALL);

Högst upp i filen (innanför php-taggar)

Se även till så att "display_errors" är påslaget, i vissa installationer är det av by default.

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Maj 2007
Citat:

Ursprungligen inskrivet av m0REc
Se även till så att "display_errors" är påslaget, i vissa installationer är det av by default.

Ja jag såg att jag hade glömt det.

Trädvy Permalänk
Medlem
Plats
Karlshamn
Registrerad
Jun 2009

Har slagit på felmeddelande-rapportering i kontrollpanelen på one men vet inte hur jag ska göra med display_errors.

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Maj 2007

error_reporting(E_ALL); ini_set("display_errors", 1);

Men det ska du inte behöva göra om du har slagit på det hos one. Dock kan du göra det lokalt hos dig. Du får alltså inga fel vare sig på one.com eller lokalt?

Trädvy Permalänk
Medlem
Plats
Karlshamn
Registrerad
Jun 2009

Nej jag får inte ett ända fel nånstans... Jag blir knäpp på detta. Fattar inte va de är för fel.