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:

Hvis filen "file.txt" var til stede, slettet skriptet den.

Kopiere en fil i PHP

Hvis du trenger å kopiere innhold fra en fil til en annen fil, bruk PHP copy()-funksjonen.

Copy("fil1", "fil2");

Fil1 – filnavn hvorfra teksten skal kopieres
- fil2 – filnavn hvor teksten skal kopieres

Lag for eksempel en fil kalt "file2.txt" på din lokale server i "test-1"-mappen. La filen være tom. La oss nå lime inn denne koden copy("fil.txt", "fil2.txt"); i php koden "file.php":

Hva har vi gjort? Laget en fil kalt "file.txt" via PHP, skrev inn filen "file.txt" via PHP " Jeg er glad for å se deg på bloggsiden ", viste resultatet i nettleseren, kopierte teksten fra filen "file.txt" og limte den inn i filen "fil2.txt". Tror du ikke at dette skjedde? Husker du at filen "file2.txt" var tom?! Åpne den! Og hva ser du? Ja, det stemmer, teksten som var i filen "file.txt":

Gi nytt navn til en fil i PHP

For å gi nytt navn til en fil, bruk PHP rename()-funksjonen:

Gi nytt navn("fil1", "fil2");

Fil1 – navnet på filen som må erstattes ( endre navn)
- fil2 – her må du gi et nytt filnavn

Her er et eksempel å fylle ut:

Gi nytt navn("fil2..txt");

Her er den ferdige koden:

Filen "file2.txt" har fått nytt navn til filen "site.txt".

Det er her jeg synes vi bør avslutte leksjonen vår. Men det er ikke alt, i neste leksjon vil vi fortsette å jobbe med filer.

I forrige artikkel snakket vi om det, og der introduserte jeg deg for funksjon rmdir(), som sletter katalogen. Imidlertid sa jeg at på denne måten kan du bare slette en tom katalog, men hvordan slette en katalog med filer, Du vil finne ut nå.

Prinsippet er veldig enkelt: å slette katalog med filer, må du først slette alle filer, samt alle underkataloger. Det kan også være filer og andre underkataloger i underkataloger, disse må også tømmes. Generelt er vanskeligheten at dybden på katalogene kan være veldig stor. Og det er åpenbart at rekursjon antyder seg selv – kaller en funksjon i seg selv.

Til tross for den tilsynelatende kompleksiteten til algoritmen, er implementeringen veldig enkel og gjennomsiktig:

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

Jeg vil prøve å forklare algoritmen til denne funksjonen på et klart språk. Først av alt får vi en liste over alle filer i en gitt katalog. Hvis de ikke er der, slett dem umiddelbart. Hvis de eksisterer, begynner vi å sortere gjennom dem én etter én. Hvis elementet er en fil, sletter du det bare ( unlink ($obj)). Hvis dette er en katalog, kaller vi opp funksjonen vår igjen og sender denne katalogen. Dette er rekursjon: funksjonen kaller seg selv. Etter at funksjonen kaller seg selv starter alt på nytt, men med en annen katalog. Alle filene blir også slettet, og alle katalogene sendes tilbake til denne funksjonen. Når alle kataloger og filer er slettet, slettes den allerede tomme katalogen.

Jeg skal fortelle deg dette, denne algoritmen er ikke så nyttig fra et praktisk synspunkt (det er ikke så ofte nødvendig slette kataloger med filer i PHP), hvor nyttig det er for utviklingen av tenkningen din. Dette er en veldig enkel algoritme og den løser et veldig, veldig komplekst problem. Lær derfor å komponere algoritmer - dette er det viktigste i ethvert programmeringsspråk.

PHP er et programmeringsspråk som primært brukes til å lage dynamiske nettsider. Akkurat som alle andre programmeringsspråk, inneholder PHP mange funksjoner, inkludert mange nyttige. For eksempel muligheten til å slette en fil, som du kan bruke i skriptene dine.

Dette tipset vil hjelpe deg å lære hvordan slett fil i PHP ved å bruke funksjonen koble fra.

Trinn-for-steg instruksjon:

For å slette en fil i PHP kan du bruke funksjonen koble fra. Ved å bruke et enkelt skript som eksempel, la oss se på hvordan det fungerer koble fra:

  1. Lag en tekstfil i et tekstredigeringsprogram (vi/vim, nano, gedit eller bare standard Notisblokk).
  2. Skriv inn eller bare kopier følgende kode inn i den:$fil="eksempel.logg";
    unlink($file);
    ?>
  3. Lagre (for eksempel under navnet testunlink.php) og plasser den opprettede skriptfilen på testwebserveren din. I samme katalog oppretter du en example.log-fil med hvilket som helst innhold. Dette er hva vi vil slette.
  4. Kjør skriptet ved å kalle det i nettleseren din, og når du ser igjen i katalogen, vil du finne at eksempel.log-filen ikke lenger er der. Fjern tilknytningen gjorde susen!

Slik fungerer det hele:

Den første linjen med skriptkode: vi bestemmer typen av skriptet vårt.

Andre linje med kode: Etter å ha kjørt skriptet vi opprettet, vil filvariabelen bli tildelt verdien eksempel.logg(merk at en fil med samme navn må være til stede i samme katalog som skriptet vi opprettet. Bare lag den med hvilket som helst innhold!).

Tredje linje med kode: Slett eksempel.log-filen ved å sende den som et argument til funksjonen for å fjerne koblingen.

Fjerde linje med skriptkode: slutten av php-kode.