Kako izbrisati datoteko php, ki ni izbrisana. Kako izbrisati datoteko v PHP? Zakaj se ta funkcija imenuje unlink()

pred 8 leti

Ste izbrisali veliko datoteko, vendar niste opazili povečanja prostega prostora ali zmanjšanja uporabe diska? Uporabljate UNIX ali drug OS POSIX?

Pri unlink() ne gre za odstranjevanje datoteke, temveč za odstranjevanje imena datoteke. Na strani priročnika piše: ``odstrani povezavo – izbriši ime in po možnosti datoteko, na katero se nanaša"«.

Večino časa ima datoteka samo eno ime -- če jo odstranite, boste odstranili (osvobodili, sprostili) tudi "telo" datoteke (z enim opozorilom, glejte spodaj). To je preprost, običajen primer.

Vendar je "povsem v redu, da ima datoteka več imen (glejte funkcijo link()) v istem ali različnih imenikih. Vsa imena se bodo nanašala na telo datoteke in jo tako rekoč `ohranjala pri življenju`". Šele ko so vsa imena odstranjena, je telo datoteke dejansko osvobojeno.

Opozorilo:
Telo datoteke lahko *tudi* ostane pri življenju (še vedno uporablja prostor na disku) s procesom, ki drži datoteko odprto. Telo ne bo sproščeno (ne bo sprostilo prostora na disku), dokler ga proces drži odprtega. Pravzaprav obstaja domiseln način za oživitev datoteke, ki je bila odstranjena z napako, vendar je postopek še vedno odprt ...

pred 10 leti

Delal sem na nekem majhnem preizkusu, kjer je bila varnostna kopija ustvarjena pred spreminjanjem glavne besedilne datoteke. Ko pride do napake, bo glavna datoteka izbrisana (nepovezana) in namesto nje bo vrnjena varnostna kopija.

Čeprav sem si približno eno uro razbijal glavo o tem, zakaj nisem mogel pridobiti svojih dovoljenj za prekinitev povezave glavne datoteke.

Končno sem vedel, kaj je narobe: ker sem delal na datoteki in je še nisem zaprl, je bila še vedno v uporabi in je seveda ni bilo mogoče izbrisati :)

Zato sem pomislil, da bi to omenil tukaj, da bi preprečil, da bi drugi naredili isto napako:

// Najprej zaprite datoteko
fclose($fp);

// Nato prekinite povezavo :)
prekini povezavo ($somefile);
?>

pred 14 leti

Če želite izbrisati vse datoteke z določeno končnico ali pravzaprav izbrisati vse z nadomestnim znakom, je veliko preprost način uporaba funkcije glob. Recimo, da želim izbrisati vse slike jpg.........

Foreach (glob ("*.jpg" ) kot $filename ) (
echo "velikost $filename" . velikost datoteke ($ime datoteke). "\n" ;
prekini povezavo ($filename);
}

?>

pred 10 leti

Za vsakogar, ki je imel težave z napako zavrnjenih dovoljenj, jo včasih povzroči, ko poskušate izbrisati datoteko, ki je v mapi, ki je višja v hierarhiji vašega delovnega imenika (tj. ko poskušate izbrisati pot, ki se začne z "../").

Da bi se izognili tej težavi, lahko uporabite chdir(), da spremenite delovni imenik v mapo, kjer se nahaja datoteka, ki jo želite prekiniti.

$old = getcwd(); // Shrani trenutni imenik
chdir($pot_do_datoteke);
prekini povezavo ($filename);
chdir ($staro); // Obnovi stari delovni imenik
?>

pred 4 leti

V sistemu OSX se pri boju proti napaki »Dovoljenje zavrnjeno« prepričajte, da ima imenik dovoljenja WRITE za izvajalnega php-uporabnika.

Poleg tega, če se zanašate na ACL-je in želite izbrisati datoteko ali simbolno povezavo, mora vsebovalni imenik imeti dovoljenje »delete_child«, da lahko prekinete povezavo med stvarmi v njem. Če mapi dodelite samo »izbriši«, boste lahko izbrisali samo mapo vsebnika, ne pa tudi predmetov v njej.

pred 4 leti

To se morda zdi očitno, vendar sem si zaradi te težave trgal lase - preverite, ali datoteka, ki jo poskušate izbrisati, trenutno ni v uporabi. Imel sem skript, ki je razčlenjeval besedilno datoteko in bi jo moral po dokončanju izbrisati, vendar sem dobival napako zavrnjenega dovoljenja, ker datoteke nisem izrecno zaprl, zato je bila tehnično še vedno v "uporabi", čeprav je bilo razčlenjevanje popolna.

pred 11 leti

Zgornja objava Ggarciaa že vsebuje eno majhno napako, closedir je treba uporabiti, tudi če je $DeleteMe false











}

Closedir($dh);
če ($DeleteMe )(
@rmdir($dir);
}
}

?>

pred 9 meseci

Obravnava napake »Vir ni na voljo« z unlink() kot izjemo z uporabo poskusnega ulova

Tudi is_file() ali file_exists() bosta preverila, ali datoteka obstaja ali ne, obstajajo možnosti, da datoteko uporabljajo nekatere aplikacije, ki bodo preprečile brisanje in unlink() bo prikazal napako »Vir ni na voljo«.

Potem ko sem preizkusil številne metode, kot so: `is_resource()`, `is_writable()`, `stream_get_meta_data()`... itd., sem prišel do edinega najboljšega načina za obravnavo napake pri *"brisanju"* datoteke, ki je bodisi * *ne obstaja** ali **obstaja, vendar ga uporablja neka aplikacija**

funkcija delete_file($pFilename)
{
if (file_exists($pFilename)) (
// Dodal muhammad.begawala
// »@« bo prenehal prikazovati napako »Vir ni na voljo«, ker je datoteka nekje odprta.
// "unlink($pFilename) !== true" bo preveril, ali je datoteka uspešno izbrisana.
// Vrženje izjeme, tako da lahko preprosto obravnavamo napako, namesto da bi jo prikazali uporabnikom.
if(@unlink($pFilename) !== true)
throw new Exception("Datoteke ni bilo mogoče izbrisati: " . $pFilename. " Zaprite vse aplikacije, ki jo uporabljajo.");
}
vrni resnico;
}

/* === UPORABA === */

poskusi (
if(delete_file("hello_world.xlsx") === true)
echo "Datoteka izbrisana";
}
ulov (izjema $e) (
echo $e->getMessage(); // natisne zgoraj definirano sporočilo o izjemi.
}

pred 11 leti

Zgornja objava Ggarciaa ima eno majhno napako, prezrla bo nize datotek in imenikov, ki so ocenjeni kot napačni (tj. "0")

Fiksna koda je spodaj (false !==)

// ggarciaa na gmail dot com (4. julij 2007 01:57)
// Moral sem izprazniti imenik, vendar sem ga ohranil
// zato sem nekoliko spremenil prispevek iz
// stefano in takys pika (28. dec. 2005 11:57)
// Kratka, a močna rekurzivna funkcija
// to deluje tudi, če imeniki vsebujejo skrite datoteke
// $dir = ciljni imenik
// $DeleteMe = če je resnično, izbrišite tudi $dir, če je napačno, ga pustite pri miru

Funkcija SureRemoveDir ($dir, $DeleteMe) (
if(! $dh = @ opendir ($dir )) return;
medtem ko (false !== ($obj = readdir ($dh ))) (
if($obj == "." || $obj == ".." ) nadaljuje;
if (!@ unlink ($dir . "/" . $obj )) SureRemoveDir ($dir . "/" . $obj , true );
}
če ($DeleteMe )(
zaprtir($dh);
@rmdir($dir);
}
}

//SureRemoveDir("EmptyMe", false);
//SureRemoveDir("OdstraniMe", res);

?>

pred 8 leti

Prekinitev povezave lahko ne uspe po uporabi ukazov ODBC v datoteki (v sistemu Windows).

Niti eneganitinaredil trik.

Samoizdal datoteko tako, da jo je bilo mogoče pozneje izbrisati ...

Nadaljujemo lekcijo, ki je posvečena temi " Delo z datotekami PHP" Če prejšnjega še niste prebrali, ga priporočam v branje, tisti, ki ste ga prebrali, pa gremo naprej. V tej lekciji se boste naučili, kako izbrisati ustvarjeno ali obstoječo datoteko s PHP, kopirati ali preimenovati, zakleniti datoteko.
No, če ste pripravljeni, potem pojdite v boj ...

Brisanje datoteke v PHP

Če morate izbrisati katero koli datoteko, uporabite funkcijo PHP unlink():

Prekini povezavo (ime datoteke);

Ime datoteke – tukaj vnesite ime datoteke, ki jo želite izbrisati.

Recimo, da moramo izbrisati datoteko »file.txt«, primer za izpolnitev bi bil tak:

Prekini povezavo ("datoteka.txt");

Pripravljena koda:

Če je bila datoteka "file.txt" prisotna, jo je skript izbrisal.

Kopiranje datoteke v PHP

Če morate vsebino kopirati iz ene datoteke v drugo, uporabite funkcijo PHP copy().

Kopiraj ("datoteka1", "datoteka2");

File1 – ime datoteke, iz katere bo kopirano besedilo
- datoteka2 – ime datoteke, v katero bo kopirano besedilo

Ustvarite na primer datoteko z imenom »file2.txt« na lokalnem strežniku v mapi »test-1«. Naj bo datoteka prazna. Zdaj pa prilepimo to kodo kopija ("datoteka.txt", "datoteka2.txt"); v php koda “file.php”:

Kaj smo storili? Ustvaril datoteko z imenom »file.txt« prek PHP, naredil vnos v datoteko »file.txt« prek PHP " Vesel sem, da te vidim na spletnem mestu bloga «, prikazal rezultat v brskalniku, kopiral besedilo iz datoteke »file.txt« in ga prilepil v datoteko »file2.txt«. Ne verjamete, da se je to zgodilo? Se spomnite, da je bila datoteka “file2.txt” prazna?! Odpri! In kaj vidite? Da, tako je, besedilo, ki je bilo v datoteki “file.txt”:

Preimenovanje datoteke v PHP

Če želite preimenovati datoteko, uporabite funkcijo PHP rename():

Preimenuj ("datoteka1", "datoteka2");

File1 – ime datoteke, ki jo je treba zamenjati ( preimenovati)
- file2 – tukaj morate podati novo ime datoteke

Tukaj je primer za izpolnitev:

Preimenuj ("datoteka2..txt");

Tukaj je končana koda:

Datoteka »file2.txt« je bila preimenovana v datoteko »site.txt«.

Tukaj mislim, da bi morali končati našo lekcijo. A to še ni vse, v naslednji lekciji bomo nadaljevali z delom z datotekami.

V prejšnjem članku smo govorili o tem in tam sem vam predstavil funkcija rmdir(), ki izbriše imenik. Vendar sem rekel, da lahko na ta način izbrišete samo prazen imenik, vendar kako izbrisati imenik z datotekami, zdaj boste izvedeli.

Načelo je zelo preprosto: do izbrisati imenik z datotekami, morate najprej izbrisati vse datoteke in vse podimenike. V podimenikih so lahko tudi datoteke in drugi podimeniki, ki jih je prav tako treba počistiti. Na splošno je težava v tem, da je globina imenikov lahko zelo velika. In očitno je, da se rekurzija predlaga sama - klicanje funkcije v sebi.

Kljub navidezni zapletenosti algoritma je izvedba zelo preprosta in pregledna:

funkcija removeDirectory($dir) (
if ($objs = glob($dir."/*")) (
foreach($objs kot $obj) (
je_dir($obj)? odstraniImenik($obj): prekini povezavo($obj);
}
}
rmdir($dir);
}
?>

Poskušal bom v jasnem jeziku razložiti algoritem te funkcije. Najprej dobimo seznam vseh datotek v danem imeniku. Če jih ni, jih takoj izbrišite. Če obstajajo, jih začnemo razvrščati enega za drugim. Če je element datoteka, jo preprosto izbrišite ( prekini povezavo ($obj)). Če je to imenik, potem ponovno pokličemo našo funkcijo in posredujemo ta imenik. To je rekurzija: funkcija pokliče sama sebe. Ko funkcija pokliče samo sebe, se vse začne znova, vendar z drugim imenikom. Izbrišejo se tudi vse njegove datoteke in vsi njegovi imeniki se pošljejo nazaj tej funkciji. Ko so izbrisani vsi imeniki in datoteke, se izbriše že prazen imenik.

To vam povem, ta algoritem s praktičnega vidika ni tako uporaben (ni tako pogosto potreben brisanje imenikov z datotekami v PHP), kako koristen je za razvoj vašega mišljenja. To je zelo preprost algoritem in rešuje zelo, zelo zapleten problem. Zato se naučite sestavljati algoritme - to je najpomembnejše v vsakem programskem jeziku.

PHP je programski jezik, ki se uporablja predvsem za ustvarjanje dinamičnih spletnih strani. Tako kot kateri koli drug programski jezik tudi PHP vsebuje veliko funkcij, vključno s številnimi uporabnimi. Na primer možnost brisanja datoteke, ki jo lahko uporabite v svojih skriptih.

Ta nasvet vam bo pomagal izvedeti, kako izbriši datoteko v PHP uporabo funkcije prekiniti povezavo.

Navodila po korakih:

Če želite izbrisati datoteko v PHP, lahko uporabite funkcijo prekiniti povezavo. Na primeru preprostega skripta si poglejmo, kako deluje prekiniti povezavo:

  1. Ustvarite besedilno datoteko v urejevalniku besedil (vi/vim, nano, gedit ali samo standardni Notepad).
  2. Vanj vnesite ali preprosto kopirajte naslednjo kodo:$file="example.log";
    prekini povezavo ($file);
    ?>
  3. Shranite (na primer pod imenom testunlink.php) in postavite ustvarjeno skriptno datoteko na svoj testni spletni strežnik. V istem imeniku ustvarite datoteko example.log s poljubno vsebino. To bomo izbrisali.
  4. Zaženite skript tako, da ga pokličete v brskalniku, in ko znova pogledate v imenik, boste ugotovili, da datoteke example.log ni več tam. Prekini povezavo uspelo!

Kako vse deluje:

Prva vrstica skriptne kode: določimo vrsto naše skripte.

Druga vrstica kode: po zagonu skripta, ki smo ga ustvarili, bo spremenljivki datoteke dodeljena vrednost primer.log(upoštevajte, da mora biti datoteka z istim imenom prisotna v istem imeniku kot skript, ki smo ga ustvarili. Samo ustvarite jo s poljubno vsebino!).

Tretja vrstica kode: Izbrišite datoteko example.log tako, da jo posredujete kot argument funkciji za prekinitev povezave.

Četrta vrstica skriptne kode: konec php kode.