Hur man tar bort en php-fil som inte är raderad. Hur tar man bort en fil i PHP? Varför kallas denna funktion unlink()

8 år sedan

Har du raderat en stor fil men ser ingen ökning av ledigt utrymme eller minskad diskanvändning? Använder du UNIX eller annat POSIX OS?

Unlink() handlar inte om att ta bort fil, det handlar om att ta bort ett filnamn. Mansidan säger: `` unlink - radera ett namn och eventuellt filen den refererar till"".

För det mesta har en fil bara ett namn -- om du tar bort det tar du också bort (gratis, deallokera) filens "kropp" (med en varning, se nedan). Det är det enkla, vanliga fallet.

Det "är dock helt okej för en fil att ha flera namn (se länk()-funktionen), i samma eller olika kataloger. Alla namn kommer att hänvisa till filkroppen och "hålla den vid liv", så att säga. Först när alla namn har tagits bort frigörs filen faktiskt.

Varningen:
En fils kropp kan *också* hållas vid liv (fortfarande använder diskutrymme) genom en process som håller filen öppen. Kroppen kommer inte att avallokeras (kommer inte att frigöra diskutrymme) så länge som processen håller den öppen. Faktum är att det finns ett fint sätt att återuppliva en fil som tagits bort av ett misstag men som fortfarande hålls öppen av en process...

10 år sedan

Jag har arbetat på ett litet test där en säkerhetskopia skapades innan huvudtextfilen modifierades. När sedan ett fel uppstår kommer huvudfilen att raderas (avlänkas) och backupfilen returneras istället.

Men jag har brutit huvudet i ungefär en timme om varför jag inte kunde få mina behörigheter rätt att ta bort länken till huvudfilen.

Äntligen visste jag vad som var fel: eftersom jag arbetade med filen och ännu inte hade stängt filen användes den fortfarande och kunde naturligtvis inte raderas:)

Så jag tänkte nämna detta här för att undvika att andra gör samma misstag:

// Stäng först filen
fclose($fp);

// Ta sedan bort länken :)
unlink ($somefile);
?>

14 år sedan

För att radera alla filer med ett visst tillägg, eller faktiskt, ta bort alla med jokertecken, är ett mycket enkelt sätt att använda glob-funktionen. Säg att jag ville ta bort alla jpg-filer.........

Foreach (glob ("*.jpg") som $filnamn ) (
echo "$filnamnsstorlek". filstorlek ($filnamn) . "\n" ;
unlink ($filnamn);
}

?>

10 år sedan

För alla som har haft problem med felet nekad behörighet, orsakas det ibland när du försöker ta bort en fil som finns i en mapp högre upp i hierarkin till din arbetskatalog (dvs. när du försöker ta bort en sökväg som startar) med "../").

Så för att kringgå det här problemet kan du använda chdir() för att ändra arbetskatalogen till mappen där filen du vill ta bort länken finns.

$old = getcwd(); // Spara den aktuella katalogen
chdir($sökväg_till_fil);
unlink ($filnamn);
chdir ($gammal); // Återställ den gamla arbetskatalogen
?>

4 år sedan

På OSX, när du kämpar mot ett "Permission Denied"-fel, se till att katalogen har WRITE-behörigheter för den exekverande php-användaren.

Dessutom, om du förlitar dig på ACLs och vill ta bort en fil eller symbollänk, måste den innehållande katalogen ha "delete_child"-behörighet för att kunna koppla bort saker inuti. Om du bara beviljar "delete" till mappen som gör att du kan ta bort själva containermappen, men inte objekten inuti.

4 år sedan

Detta kan tyckas självklart, men jag höll på att slita mig med det här problemet - se till att filen du försöker ta bort inte används för närvarande. Jag hade ett skript som analyserade en textfil och var tänkt att radera den efter att ha slutförts, men jag fick hela tiden ett felmeddelande om permission nekad eftersom jag inte uttryckligen hade stängt filen, så det var tekniskt sett fortfarande "används" även om analysen var komplett.

11 år sedan

Ggarciaas inlägg ovan har redan ett litet fel, closedir måste användas även om $DeleteMe är falskt











}

Closedir($dh);
if ($DeleteMe )(
@rmdir($dir);
}
}

?>

9 månader sen

Hanterar felet "Resource Unavailable" genom att unlink() som undantag använder try catch

Även is_file() eller file_exists() kommer att kontrollera om filen finns eller inte, det finns chanser att filen används av vissa applikationer som förhindrar radering och unlink() kommer att visa felet "Resource Unavailable".

Så efter att ha provat många metoder som: `is_resource()`, `is_writable()`, `stream_get_meta_data()`...etc, nådde jag det enda bästa sättet att hantera fel när jag *"raderade"* en fil som antingen är * *finns inte** eller **finns men används av något program**

funktion delete_file($pFilename)
{
if (fil_exists($pFilename)) (
// Tillagd av muhammad.begawala
// "@" kommer att sluta visa felet "Resurs ej tillgänglig" eftersom filen är öppen någonstans.
// "unlink($pFilename) !== true" kommer att kontrollera om filen har raderats.
// Kasta undantag så att vi enkelt kan hantera fel istället för att visa för användare.
if(@unlink($pFilename) !== sant)
throw new Exception("Kunde inte ta bort filen: " . $pFilename . " Stäng alla program som använder den.");
}
returnera sant;
}

/* === ANVÄNDNING === */

Prova (
if(delete_file("hello_world.xlsx") === sant)
echo "Fil raderad";
}
fånga (Undantag $e) (
echo $e->getMessage(); // kommer att skriva ut undantagsmeddelandet definierat ovan.
}

11 år sedan

Ggarciaas inlägg ovan har ett litet fel, det kommer att ignorera fil- och katalogsträngar som utvärderas som falska (dvs. "0")

Fast kod är nedan (falskt !==)

// ggarciaa på gmail dot com (04-juli-2007 01:57)
// Jag behövde tömma en katalog, men behålla den
// så jag modifierade bidraget något från
// stefano på takys dot it (28-dec-2005 11:57)
// En kort men kraftfull rekursiv funktion
// som fungerar även om dirs innehåller dolda filer
// $dir = målkatalogen
// $DeleteMe = om sant radera också $dir, om false lämna det ifred

Funktion SureRemoveDir ($dir, $DeleteMe) (
if(! $dh = @ opendir ($dir )) returnera;
while (false !== ($obj = readdir ($dh ))) (
if($obj == "." || $obj == ".." ) fortsätt;
if (!@ unlink ($dir . "/" . $obj )) SureRemoveDir ($dir . "/" . $obj , true );
}
if ($DeleteMe )(
closedir($dh);
@rmdir($dir);
}
}

//SureRemoveDir("EmptyMe", false);
//SureRemoveDir("RemoveMe", true);

?>

8 år sedan

Avlänkning kan misslyckas efter att ha använt ODBC-kommandon på filen (på Windows).

Varkeninte hellergjorde susen.

Endastsläppte filen så att den kunde raderas efteråt ...

Vi fortsätter lektionen, som är tillägnad ämnet " Arbeta med PHP-filer" Om du inte har läst den förra rekommenderar jag att du läser den, och för de som har läst den, låt oss gå vidare. I den här lektionen kommer du att lära dig hur du tar bort en skapad eller befintlig fil med PHP, kopierar eller byter namn, låser en fil.
Tja, om du är redo, gå till strid...

Ta bort en fil i PHP

Om du behöver ta bort någon fil, använd PHP unlink()-funktionen:

Unlink(filnamn);

Filnamn – här anger du namnet på filen du vill radera.

Låt oss säga att vi måste ta bort filen "file.txt", ett exempel att fylla skulle vara så här:

Unlink("file.txt");

Klar kod:

Om filen "file.txt" fanns raderade skriptet den.

Kopiera en fil i PHP

Om du behöver kopiera innehåll från en fil till en annan fil, använd PHP copy()-funktionen.

Copy("fil1", "fil2");

Fil1 – filnamn varifrån texten kommer att kopieras
- fil2 – filnamn där texten kommer att kopieras

Skapa till exempel en fil som heter "file2.txt" på din lokala server i mappen "test-1". Låt filen vara tom. Låt oss nu klistra in den här koden copy("fil.txt", "fil2.txt"); i php koden "file.php":

Vad har vi gjort? Skapade en fil som heter "file.txt" via PHP, gjorde en post i filen "file.txt" via PHP " Jag är glad att se dig på bloggen ", visade resultatet i webbläsaren, kopierade texten från filen "file.txt" och klistrade in den i filen "file2.txt". Tror du inte att detta hände? Kommer du ihåg att filen "file2.txt" var tom?! Öppna den! Och vad ser du? Ja, det stämmer, texten som fanns i filen "file.txt":

Byta namn på en fil i PHP

För att byta namn på en fil, använd PHP rename()-funktionen:

Byt namn("fil1", "fil2");

Fil1 – namnet på filen som måste ersättas ( Döp om)
- fil2 – här måste du ange ett nytt filnamn

Här är ett exempel att fylla i:

Byt namn("fil2..txt");

Här är den färdiga koden:

Filen "file2.txt" har bytt namn till filen "site.txt".

Det är här jag tycker att vi ska avsluta vår lektion. Men det är inte allt, i nästa lektion kommer vi att fortsätta arbeta med filer.

I den tidigare artikeln pratade vi om det, och där presenterade jag dig för funktion rmdir(), som tar bort katalogen. Jag sa dock att på detta sätt kan du bara ta bort en tom katalog, men hur man tar bort en katalog med filer, Du kommer att få reda på det nu.

Principen är mycket enkel: att ta bort katalog med filer, måste du först radera alla filer, såväl som alla underkataloger. Det kan också finnas filer och andra underkataloger inuti underkataloger, dessa måste också rensas. I allmänhet är svårigheten att katalogernas djup kan vara mycket stort. Och det är uppenbart att rekursion antyder sig själv – kallar en funktion inom sig själv.

Trots den uppenbara komplexiteten hos algoritmen är implementeringen mycket enkel och transparent:

funktion removeDirectory($dir) (
if ($objs = glob($dir."/*")) (
foreach($objs som $obj) (
is_dir($obj) ? removeDirectory($obj): unlink($obj);
}
}
rmdir($dir);
}
?>

Jag ska försöka förklara algoritmen för denna funktion på ett tydligt språk. Först och främst får vi en lista över alla filer i en given katalog. Om de inte finns där, ta bort det omedelbart. Om de finns, då börjar vi sortera igenom dem en efter en. Om elementet är en fil, ta helt enkelt bort det ( unlink ($obj)). Om detta är en katalog, anropar vi vår funktion igen och skickar denna katalog. Detta är rekursion: funktionen anropar sig själv. Efter att funktionen anropat sig själv startar allt igen, men med en annan katalog. Alla dess filer raderas också, och alla dess kataloger skickas tillbaka till den här funktionen. När alla kataloger och filer har raderats tas den redan tomma katalogen bort.

Jag ska berätta det här, den här algoritmen är inte så användbar ur praktisk synvinkel (det är inte så ofta nödvändigt ta bort kataloger med filer i PHP), hur användbart det är för utvecklingen av ditt tänkande. Detta är en mycket enkel algoritm och den löser ett mycket, mycket komplext problem. Lär dig därför att komponera algoritmer - det här är det viktigaste i alla programmeringsspråk.

PHP är ett programmeringsspråk som främst används för att skapa dynamiska webbsidor. Precis som alla andra programmeringsspråk innehåller PHP många funktioner, inklusive många användbara. Till exempel möjligheten att ta bort en fil, som du kan använda i dina skript.

Det här tipset hjälper dig att lära dig hur radera fil i PHP använder funktionen ta bort länken.

Steg-för-steg-instruktion:

För att radera en fil i PHP kan du använda funktionen ta bort länken. Med hjälp av ett enkelt skript som exempel, låt oss titta på hur det fungerar ta bort länken:

  1. Skapa en textfil i en textredigerare (vi/vim, nano, gedit eller bara standard Notepad).
  2. Skriv eller kopiera helt enkelt följande kod till den:$fil="example.log";
    unlink($file);
    ?>
  3. Spara (till exempel under namnet testunlink.php) och placera den skapade skriptfilen på din testwebbserver. Skapa en example.log-fil med valfritt innehåll i samma katalog. Detta är vad vi kommer att radera.
  4. Kör skriptet genom att anropa det i din webbläsare, och när du tittar igen i katalogen kommer du att upptäcka att filen example.log inte längre finns där. Ta bort länken gjorde susen!

Hur det hela fungerar:

Den första raden med skriptkod: vi bestämmer typen av vårt skript.

Andra kodraden: Efter att ha kört skriptet vi skapade kommer filvariabeln att tilldelas värdet exempel.logg(observera att en fil med samma namn måste finnas i samma katalog som skriptet vi skapade. Skapa den med valfritt innehåll!).

Tredje raden med kod: Ta bort filen example.log genom att skicka den som ett argument till unlink-funktionen.

Fjärde raden i skriptkoden: slutet av php-koden.