Kako izbrisati php datoteku koja nije izbrisana. Kako izbrisati datoteku u PHP-u? Zašto se ova funkcija zove unlink()

prije 8 godina

Izbrisali ste veliku datoteku, ali ne vidite povećanje slobodnog prostora ili smanjenje upotrebe diska? Koristite UNIX ili neki drugi POSIX OS?

Unlink() se ne odnosi na uklanjanje datoteke, radi se o uklanjanju naziva datoteke. Manpage kaže: ``unlink - izbrišite naziv i eventualno datoteku na koju se odnosi"".

Većinu vremena datoteka ima samo jedno ime -- uklanjanjem će se također ukloniti (osloboditi, osloboditi) "tijelo" datoteke (uz jedno upozorenje, vidi dolje). To je jednostavan, uobičajeni slučaj.

Međutim, "sasvim je u redu da datoteka ima nekoliko naziva (pogledajte funkciju link()), u istim ili različitim direktorijima. Sva imena će se odnositi na tijelo datoteke i `očuvati je na životu", da tako kažemo. Tek kada su sva imena uklonjena, tijelo datoteke je zapravo oslobođeno.

Upozorenje:
Tijelo datoteke *također* može biti `održano na životu' (još uvijek koristi prostor na disku) procesom koji drži datoteku otvorenom. Tijelo se neće osloboditi (neće osloboditi prostor na disku) sve dok ga proces drži otvorenim. Zapravo, postoji otmjen način oživljavanja datoteke uklonjene greškom, ali još uvijek otvorene procesom...

prije 10 godina

Radio sam na nekoj maloj probi gdje je sigurnosna kopija stvorena prije izmjene glavne tekstualne datoteke. Zatim, kada se pojavi pogreška, glavna datoteka će biti izbrisana (nepovezana) i umjesto nje će se vratiti rezervna datoteka.

Ipak, oko sat vremena razbijam glavu o tome zašto nisam mogao dobiti prava prava za prekid veze s glavnom datotekom.

Napokon sam shvatio što nije u redu: budući da sam radio na datoteci i još je nisam zatvorio, još uvijek je bila u upotrebi i naravno nije se mogla izbrisati :)

Pa sam mislio spomenuti ovo ovdje, kako bih izbjegao da drugi naprave istu pogrešku:

// Prvo zatvorite datoteku
fclose($fp);

// Zatim prekini vezu :)
prekinuti vezu ($somefile);
?>

prije 14 godina

Da biste izbrisali sve datoteke s određenom ekstenzijom, ili zapravo, izbrisali sve sa zamjenskim znakom, vrlo jednostavan način je korištenje funkcije glob. Recimo da sam htio izbrisati sve jpg-ove.........

Foreach (glob ("*.jpg" ) kao $filename ) (
echo " veličina $filename " . veličina datoteke ($filename) . "\n" ;
prekinuti vezu ($filename);
}

?>

prije 10 godina

Za svakoga tko je imao problema s pogreškom odbijenih dopuštenja, to je ponekad uzrokovano kada pokušate izbrisati datoteku koja je u mapi višoj u hijerarhiji vašeg radnog direktorija (tj. kada pokušavate izbrisati stazu koja počinje s "../").

Da biste zaobišli ovaj problem, možete koristiti chdir() za promjenu radnog direktorija u mapu u kojoj se nalazi datoteka koju želite prekinuti.

$staro = getcwd(); // Spremi trenutni direktorij
chdir($put_do_datoteke);
prekinuti vezu ($filename);
chdir ($stari); // Vrati stari radni direktorij
?>

prije 4 godine

Na OSX-u, kada se borite protiv pogreške "Permission Denied", provjerite ima li direktorij dozvole WRITE za izvršavajućeg php-korisnika.

Nadalje, ako se oslanjate na ACL-ove i želite izbrisati datoteku ili simboličku vezu, direktorij koji sadrži mora imati dopuštenje "delete_child" kako bi se poništile veze stvari unutar. Ako dodijelite "delete" samo mapi, to će vam omogućiti da izbrišete samu mapu spremnika, ali ne i objekte unutar nje.

prije 4 godine

Ovo bi se moglo činiti očiglednim, ali čupao sam kosu s ovim problemom - provjerite da se datoteka koju pokušavate izbrisati trenutno ne koristi. Imao sam skriptu koja je analizirala tekstualnu datoteku i trebala ju je izbrisati nakon dovršetka, ali stalno sam dobivala pogrešku odbijene dozvole jer nisam eksplicitno zatvorio datoteku, stoga se tehnički još uvijek "koristi" iako je analiza bila potpuna.

prije 11 godina

Gornji post Ggarciaa već ima jednu malu pogrešku, Closedir se mora koristiti čak i ako je $DeleteMe false











}

Zatvoridir($dh);
ako ($DeleteMe )(
@rmdir($dir);
}
}

?>

prije 9 mjeseci

Rukovanje pogreškom "Resurs nedostupan" pomoću unlink() kao iznimke koristeći try catch

Čak i is_file() ili file_exists() će provjeriti postoji li datoteka ili ne, postoje šanse da datoteku koriste neke aplikacije koje će spriječiti brisanje i unlink() će prikazati pogrešku "Resource Unavailable".

Dakle, nakon isprobavanja mnogih metoda kao što su: `is_resource()`, `is_writable()`, `stream_get_meta_data()`... itd., došao sam do jedinog najboljeg načina za rješavanje pogreške dok *"brišem"* datoteku koja je ili * *ne postoji** ili **postoji, ali ga koristi neka aplikacija**

funkcija delete_file($pFilename)
{
if (file_exists($pFilename)) (
// Dodao muhammad.begawala
// "@" će prestati prikazivati ​​pogrešku "Resurs nedostupan" jer je datoteka negdje otvorena.
// "unlink($pFilename) !== true" će provjeriti je li datoteka uspješno izbrisana.
// Izdavanje iznimke kako bismo mogli jednostavno obraditi pogrešku umjesto prikazivanja korisnicima.
if(@unlink($pFilename) !== true)
throw new Exception("Nije moguće izbrisati datoteku: " . $pFilename . " Zatvorite sve aplikacije koje je koriste.");
}
vratiti istinito;
}

/* === UPOTREBA === */

pokušaj (
if(delete_file("hello_world.xlsx") === true)
echo "Datoteka izbrisana";
}
catch (Iznimka $e) (
echo $e->getMessage(); // ispisat će gore definiranu poruku o iznimci.
}

prije 11 godina

Ggarciain post iznad ima jednu malu pogrešku, zanemarit će nizove datoteka i direktorija koji su procijenjeni kao lažni (tj. "0")

Fiksni kod je ispod (false !==)

// ggarciaa na gmail dot com (04. srpnja 2007. 01:57)
// Trebao sam isprazniti direktorij, ali sam ga zadržao
// pa sam malo izmijenio prilog iz
// stefano i takys dot it (28. prosinca 2005. 11:57)
// Kratka, ali moćna rekurzivna funkcija
// to također radi ako direktoriji sadrže skrivene datoteke
// $dir = ciljni direktorij
// $DeleteMe = ako je točno, izbrišite i $dir, ako je netočno, ostavite ga na miru

Funkcija SureRemoveDir ($dir, $DeleteMe) (
if(! $dh = @ opendir ($dir )) povratak;
dok (false !== ($obj = readdir ($dh ))) (
if($obj == "." || $obj == ".." ) nastavi;
if (!@ unlink ($dir . "/" . $obj )) SureRemoveDir ($dir . "/" . $obj , true );
}
ako ($DeleteMe )(
zatvoreno ($dh);
@rmdir($dir);
}
}

//SureRemoveDir("IsprazniMe", false);
//SureRemoveDir("UkloniMe", istina);

?>

prije 8 godina

Prekidanje veze može uspjeti nakon korištenja ODBC naredbi na datoteci (u sustavu Windows).

Nininapravio trik.

Samopustio datoteku tako da se kasnije može izbrisati ...

Nastavljamo lekciju koja je posvećena temi " Rad s PHP datotekama" Ako niste pročitali prethodni, preporučam da pročitate, a za one koji su pročitali, idemo dalje. U ovoj lekciji naučit ćete kako izbrisati stvorenu ili postojeću datoteku pomoću PHP-a, kopirati ili preimenovati, zaključati datoteku.
Pa, ako ste spremni, onda idite u bitku...

Brisanje datoteke u PHP-u

Ako trebate izbrisati bilo koju datoteku, upotrijebite funkciju PHP unlink():

Prekini vezu (naziv datoteke);

Naziv datoteke – ovdje unesite naziv datoteke koju želite izbrisati.

Recimo da trebamo izbrisati datoteku “file.txt”, primjer za popunjavanje bio bi ovakav:

Prekini vezu ("datoteka.txt");

Gotov kod:

Ako je datoteka "file.txt" bila prisutna, skripta ju je izbrisala.

Kopiranje datoteke u PHP-u

Ako trebate kopirati sadržaj iz jedne datoteke u drugu, koristite funkciju PHP copy().

Kopiraj("datoteka1", "datoteka2");

File1 – naziv datoteke iz koje će se tekst kopirati
- file2 – naziv datoteke u koju će se tekst kopirati

Na primjer, stvorite datoteku pod nazivom "file2.txt" na svom lokalnom poslužitelju u mapi "test-1". Neka datoteka bude prazna. Sada zalijepimo ovaj kod kopiraj("datoteka.txt", "datoteka2.txt"); u php kod “file.php”:

Što smo učinili? Kreirao datoteku pod nazivom “file.txt” putem PHP-a, napravio unos u datoteku “file.txt” putem PHP-a “ Drago mi je što te vidim na blogu ", prikazao rezultat u pregledniku, kopirao tekst iz datoteke "file.txt" i zalijepio ga u datoteku "file2.txt". Ne vjerujete da se to dogodilo? Sjećate li se da je datoteka “file2.txt” bila prazna?! Otvori! I što vidiš? Da, tako je, tekst koji je bio u datoteci “file.txt”:

Preimenovanje datoteke u PHP-u

Da biste preimenovali datoteku, koristite funkciju PHP rename():

Preimenuj("datoteka1", "datoteka2");

File1 – naziv datoteke koju treba zamijeniti ( preimenovati)
- file2 – ovdje trebate dati novi naziv datoteke

Evo primjera za popunjavanje:

Preimenuj("datoteka2..txt");

Evo gotovog koda:

Datoteka “file2.txt” preimenovana je u datoteku “site.txt”.

Ovdje mislim da bismo trebali završiti našu lekciju. Ali to nije sve, u sljedećoj lekciji nastavit ćemo rad s datotekama.

U prošlom članku smo pričali o tome, a tamo sam vas i upoznao funkcija rmdir(), koji briše imenik. Međutim, rekao sam da na ovaj način možete izbrisati samo prazan direktorij, ali kako izbrisati direktorij s datotekama, Sada ćete saznati.

Princip je vrlo jednostavan: da izbrisati direktorij s datotekama, prvo morate izbrisati sve datoteke, kao i sve poddirektorije. Također mogu postojati datoteke i drugi poddirektorije unutar poddirektorija, i njih je potrebno obrisati. Općenito, poteškoća je u tome što dubina imenika može biti vrlo velika. I očito je da se rekurzija sugerira sama od sebe – pozivanje funkcije unutar sebe.

Unatoč prividnoj složenosti algoritma, implementacija je vrlo jednostavna i transparentna:

funkcija removeDirectory($dir) (
if ($objs = glob($dir."/*")) (
foreach($objs kao $obj) (
je_dir($obj)? removeDirectory($obj) : unlink($obj);
}
}
rmdir($dir);
}
?>

Pokušat ću jasnim jezikom objasniti algoritam ove funkcije. Prije svega, dobivamo popis svih datoteka unutar određenog direktorija. Ako ih nema, odmah ih izbrišite. Ako postoje, počinjemo ih sortirati jednog po jednog. Ako je element datoteka, jednostavno ga izbrišite ( prekini vezu ($obj)). Ako je ovo direktorij, tada ponovno pozivamo našu funkciju, prosljeđujući ovaj direktorij. Ovo je rekurzija: funkcija poziva samu sebe. Nakon što se funkcija sama pozove, sve počinje ispočetka, ali s drugim imenikom. Sve njegove datoteke se također brišu, a svi njegovi direktoriji se šalju natrag ovoj funkciji. Kada su svi direktoriji i datoteke izbrisani, već prazan direktorij se briše.

Reći ću vam ovo, ovaj algoritam nije toliko koristan s praktične točke gledišta (nije tako često potreban brisanje direktorija s datotekama u PHP-u), koliko je to korisno za razvoj vašeg razmišljanja. Ovo je vrlo jednostavan algoritam i rješava vrlo, vrlo složen problem. Stoga naučite sastavljati algoritme - to je najvažnija stvar u svakom programskom jeziku.

PHP je programski jezik koji se prvenstveno koristi za izradu dinamičkih web stranica. Baš kao i svaki drugi programski jezik, PHP sadrži mnogo značajki, uključujući mnoge korisne. Na primjer, mogućnost brisanja datoteke koju možete koristiti u svojim skriptama.

Ovaj savjet pomoći će vam da naučite kako izbrisati datoteku u PHP-u koristeći funkciju prekinuti vezu.

Korak po korak upute:

Za brisanje datoteke u PHP-u možete koristiti funkciju prekinuti vezu. Koristeći jednostavnu skriptu kao primjer, pogledajmo kako funkcionira prekinuti vezu:

  1. Napravite tekstualnu datoteku u uređivaču teksta (vi/vim, nano, gedit ili samo standardni Notepad).
  2. Unesite ili jednostavno kopirajte sljedeći kod u njega:$file="example.log";
    prekini vezu ($datoteka);
    ?>
  3. Spremite (na primjer, pod imenom testunlink.php) i postavite stvorenu datoteku skripte na svoj testni web poslužitelj. U istom direktoriju stvorite datoteku example.log s bilo kojim sadržajem. Ovo ćemo izbrisati.
  4. Pokrenite skriptu tako da je pozovete u svom pregledniku, a kada ponovno pogledate u direktorij, vidjet ćete da datoteka example.log više nije tamo. Prekini vezu uspio je!

Kako to sve funkcionira:

Prvi red koda skripte: određujemo vrstu naše skripte.

Drugi redak koda: Nakon pokretanja skripte koju smo izradili, varijabli datoteke bit će dodijeljena vrijednost primjer.log(imajte na umu da datoteka s istim nazivom mora biti prisutna u istom direktoriju kao i skripta koju smo stvorili. Samo je stvorite s bilo kojim sadržajem!).

Treći redak koda: Izbrišite datoteku example.log tako da je proslijedite kao argument funkciji za uklanjanje veze.

Četvrti red koda skripte: kraj php koda.