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: