Hvordan slette en php-fil som ikke er slettet. Hvordan slette en fil i PHP? Hvorfor kalles denne funksjonen unlink()
8 år siden
Slettet en stor fil, men ser ingen økning i ledig plass eller redusert diskbruk? Bruker du UNIX eller annet POSIX OS?
Unlink() handler ikke om å fjerne fil, det handler om å fjerne et filnavn. Manpagen sier: ``unlink - slett et navn og muligens filen den refererer til"".
Mesteparten av tiden har en fil bare ett navn -- fjerning av det vil også fjerne (gratis, deallokere) filens "body" (med ett forbehold, se nedenfor). Det er det enkle, vanlige tilfellet.
Imidlertid er det "helt greit at en fil har flere navn (se link()-funksjonen), i samme eller forskjellige kataloger. Alle navnene vil referere til filkroppen og "holde den i live", for å si det sånn. Først når alle navnene er fjernet, blir selve filen faktisk frigjort.
Forbeholdet:
En fils kropp kan *også* holdes i live (fortsatt bruker diskplass) ved en prosess som holder filen åpen. Hoveddelen vil ikke bli deallokert (vil ikke frigjøre diskplass) så lenge prosessen holder den åpen. Faktisk er det en fancy måte å gjenopplive en fil som er fjernet ved en feil, men fortsatt holdt åpen av en prosess ...
For 10 år siden
Jeg har jobbet med en liten prøve der en sikkerhetskopifil ble opprettet før jeg endret hovedtekstfilen. Så når en feil blir kastet, vil hovedfilen bli slettet (frakoblet) og sikkerhetskopifilen returneres i stedet.
Skjønt, jeg har knust hodet i omtrent en time på hvorfor jeg ikke kunne få rettighetene mine til å koble fra hovedfilen.
Endelig visste jeg hva som var galt: fordi jeg jobbet med filen og ennå ikke hadde lukket filen, var den fortsatt i bruk og kunne selvfølgelig ikke slettes:)
Så jeg tenkte å mentoine dette her, for å unngå at andre gjør den samme feilen:
// Lukk først filen
fclose($fp);
// Så fjern linken :)
unlink ($somefile);
?>
14 år siden
For å slette alle filer med en bestemt utvidelse, eller faktisk slette alle med jokertegn, er en veldig enkel måte å bruke glob-funksjonen. Si at jeg ville slette alle jpg-er.........
Foreach (glob ("*.jpg") som $filnavn ) (
echo "$filnavnstørrelse". filstørrelse ($filnavn) . "\n" ;
unlink ($filnavn);
}
?>
For 10 år siden
For alle som har hatt et problem med feilen med tillatelser nektet, er det noen ganger forårsaket når du prøver å slette en fil som er i en mappe høyere i hierarkiet til arbeidskatalogen din (dvs. når du prøver å slette en bane som starter med "../").
Så for å omgå dette problemet, kan du bruke chdir() for å endre arbeidskatalogen til mappen der filen du vil koble fra er plassert.
$old = getcwd(); // Lagre gjeldende katalog
chdir($bane_til_fil);
unlink ($filnavn);
chdir ($gammel); // Gjenopprett den gamle arbeidskatalogen
?>
4 år siden
På OSX, når du kjemper mot en "Permission Denied"-feil, sørg for at katalogen har SKRIVE-tillatelser for den utførende php-brukeren.
Videre, hvis du stoler på tilgangskontrollister og ønsker å slette en fil eller symbolkobling, må den inneholdende katalogen ha "delete_child"-tillatelse for å koble fra ting inne. Hvis du bare gir "slett" til mappen som vil tillate deg å slette selve containermappen, men ikke objektene inni.
4 år siden
Dette kan virke åpenbart, men jeg rev meg i håret med dette problemet - sørg for at filen du prøver å slette ikke brukes for øyeblikket. Jeg hadde et skript som analyserte en tekstfil og skulle slette den etter å ha fullført den, men fikk stadig en feilmelding om tillatelse nektet fordi jeg ikke eksplisitt hadde lukket filen, derfor ble den teknisk sett fortsatt "brukt" selv om parsingen var fullstendig.
11 år siden
Ggarciaas innlegg ovenfor har allerede en liten feil, closedir må brukes selv om $DeleteMe er falsk
}
Closedir($dh);
if ($DeleteMe )(
@rmdir($dir);
}
}
?>
9 måneder siden
Håndterer "Ressurs utilgjengelig"-feil ved å unlink() som unntak ved å bruke try catch
Selv is_file() eller file_exists() vil sjekke om filen eksisterer eller ikke, det er sjanser for at filen blir brukt av noen programmer som vil forhindre sletting og unlink() vil vise "Ressurs utilgjengelig" feil.
Så etter å ha prøvd mange metoder som: `is_resource()`, `is_writable()`, `stream_get_meta_data()`...osv, nådde jeg den eneste beste måten å håndtere feil mens jeg *"slettet"* en fil som enten er * *finnes ikke** eller **finnes, men brukes av et program**
funksjon delete_file($pFilename)
{
if (fil_eksisterer($pFilnavn)) (
// Lagt til av muhammad.begawala
// "@" vil slutte å vise "Ressurs utilgjengelig" feil fordi filen er åpen et sted.
// "unlink($pFilename) !== true" vil sjekke om filen er slettet.
// Kaster unntak slik at vi enkelt kan håndtere feil i stedet for å vise til brukere.
if(@unlink($pFilename) !== sant)
throw new Exception("Kunne ikke slette filen: " . $pFilename . " Vennligst lukk alle applikasjoner som bruker den.");
}
return true;
}
/* === BRUK === */
prøv (
if(delete_file("hello_world.xlsx") === sant)
ekko "Fil slettet";
}
catch (unntak $e) (
echo $e->getMessage(); // vil skrive ut unntaksmelding definert ovenfor.
}
11 år siden
Ggarciaas innlegg ovenfor har en liten feil, den vil ignorere fil- og katalogstrenger som vurderes som falske (dvs. "0")
Fast kode er nedenfor (false !==)
// ggarciaa at gmail dot com (04-juli-2007 01:57)
// Jeg trengte å tømme en katalog, men beholde den
// så jeg endret litt på bidraget fra
// stefano at takys dot it (28. desember 2005 11:57)
// En kort, men kraftig rekursiv funksjon
// som fungerer også hvis dirs inneholder skjulte filer
// $dir = målkatalogen
// $DeleteMe = hvis sant, slett også $dir, hvis false la det være
Funksjon SureRemoveDir ($dir, $DeleteMe) (
if(! $dh = @ opendir ($dir )) returner;
while (false !== ($obj = readdir ($dh))) (
if($obj == "." || $obj == ".." ) fortsett;
if (!@ unlink ($dir . "/" . $obj )) SureRemoveDir ($dir . "/" . $obj , true );
}
if ($DeleteMe )(
lukket($dh);
@rmdir($dir);
}
}
//SureRemoveDir("EmptyMe", false);
//SureRemoveDir("FjernMeg", sant);
?>
8 år siden
Frakobling kan mislykkes etter bruk av ODBC-kommandoer på filen (på Windows).
Ingenellergjorde susen.
Barega ut filen slik at den kunne slettes etterpå ...
Vi fortsetter leksjonen, som er dedikert til emnet " Arbeid med PHP-filer" Hvis du ikke har lest den forrige, anbefaler jeg å lese den, og for de som har lest den, la oss gå videre. I denne leksjonen lærer du hvordan du sletter en opprettet eller eksisterende fil ved hjelp av PHP, kopierer eller gir nytt navn, låser en fil.
Vel, hvis du er klar, så gå til kamp...
Sletting av en fil i PHP
Hvis du trenger å slette en fil, bruk PHP unlink()-funksjonen:
Unlink (filnavn);
Filnavn – her skriv inn navnet på filen du vil slette.
La oss si at vi må slette filen "file.txt", et eksempel å fylle vil være slik:
Unlink("file.txt");
Klar kode: