PHP-hjälp - Radera mapp med filer i

Permalänk
Medlem

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

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Medlem

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

Permalänk
Medlem
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 /.

Permalänk
Medlem
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.

Permalänk
Medlem

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

Permalänk
Medlem
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.

Permalänk
Medlem

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

Permalänk
Medlem

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

Permalänk
Medlem

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)

Permalänk
Medlem

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

Permalänk
Medlem

Sitter du på ett windows eller unix-system?

Permalänk
Medlem

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.

Permalänk
Medlem

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 )

Permalänk
Hedersmedlem
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.

Visa signatur

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

Permalänk
Medlem
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.

Permalänk
Medlem

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

Permalänk
Medlem

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?

Permalänk
Medlem

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