Faili olemasolu kontrollimine. Kuidas kontrollida faili olemasolu PHP-s

Mõnikord peate kontrollima, kas see on olemas määratud fail või mitte, näiteks selleks, et hiljem failiga mingeid toiminguid teha.

Selle probleemiga puutusin kokku ka moodulit arendades. Ja leidsin kaks võimalust probleemi lahendamiseks.

Faili olemasolu kontrollimine URL-i lingi abil

PHP-s on funktsioon " fopen", mida saab kasutada määratud URL-i avamiseks.

Mida me teeme? Proovime faili avada ja kui see õnnestub, siis fail on olemas, vastasel juhul faili pole olemas.

Rakendamine:

Aga mis siis, kui meil pole mitte üks fail, vaid mitu nii-öelda linkide massiivi? Just see ülesanne seisis minu ees algusest peale. Ja selle probleemi lahendus on järgmine:

Sel juhul saame loendi ainult olemasolevatest failidest.

Kohaliku faili olemasolu kontrollimine

Sõna "kohalik" tähendab, et skript ja kontrollimiseks mõeldud failid asuvad samas serveris. Kui teil on piisavalt suur massiiv lingid - see valik on probleemi lahendamiseks parim, kuna me ei esita taotlust kolmanda osapoole server, kuid kontrollib määratud katalooge.

See meetod kasutab funktsiooni "file_exists" ja sarnast funktsiooni eelmine versioon lihtsalt asendage osa skriptist:

Ja sama ka lingimassiivi kohta:

Mida see väärt on tähelepanu pöörama? Asjaolu, et see meetod on mugav meie sees asuvate failide käitamiseks failisüsteem. Seetõttu on soovitatav märkida kõik lingid suhtelistena.

Muide, ühte tellimust tehes sain just selle meetodiga vaid paari sekundiga läbi skannida umbes 135 000 faili.

Selle funktsiooni nõutav parameeter on pathname, mis määrab loodava kataloogi tee.

mkdir( "uus kaust");

Kui määrate kausta sel viisil, luuakse see samasse kataloogi, kust PHP skript käivitati. Kui teil on vaja luua kataloog muus kohas, saate seda määrata suhteline tee loodavasse või täpsustatavasse kausta täis tee saidi juurkataloogist.

mkdir( "../uus kaust" ); // üks tase allapoole

mkdir("/kaust1/kaust2/uus kaust" ); // täielik tee

Viimases näites eelduseks seal on olemas alamkataloogid "kaust1" ja "kaust2". Kui neid seal pole, ei saa selle vormi funktsioon kausta luua ja tagastab veateate:

Hoiatus: mkdir() : sellist faili ega kataloogi pole ...

Kui see õnnestub, naaseb funktsioon väärtus Tõsi. Kui pakki ei loodud, tagastatakse False.

if (mkdir("uus kaust"))
kaja "Kaust loodi edukalt";
muidu
kaja "Kausta pole loodud";

Kuid te ei tohiks seda funktsiooni kasutada ilma kausta olemasolu kontrollimata, kuna server kuvab ikkagi veateate, et kausta ei saanud luua.

Õiguste määramine kausta loomisel

Funktsiooni mkdir teine ​​valikuline parameeter vastutab loodud kausta õiguste määramise eest. Vaikimisi on määratud maksimaalsed õigused – 0777.

Õigused määratakse kaheksandväärtusena, mille alguses on kohustuslik null. Peale esimese nulli tähistavad numbrid omaniku, omanike rühma ja kõigi teiste juurdepääsutasemeid.

0 – juurdepääs keelatud;

1 – lugemisõigus;

2 – kirjutamisõigus;

4 – täitmisjuurdepääs.

Enamasti määratakse õigused liitsummana, näiteks:

7 – täielik juurdepääs (1+2+4);

5 – lugemine ja teostamine (1+4).

mkdir( "uus kaust" , 0777); // täielik juurdepääs kõigile

Mitme pesastatud alamkataloogi loomine

Saate luua mitu alamkausta korraga, määrates lihtsalt teise valikulise Boole'i ​​parameetri – rekursiivne.

mkdir("kaust1/kaust2/uus kaust" , 0777, tõsi ); // täielik juurdepääs kõigile

Sel juhul, kui kaustu "kaust1" ja "kaust2" pole, loob funktsioon nii need kui ka kausta "uus kaust". Kui muid probleeme ei teki, siis veateateid ei kuvata ja funktsioon tagastab väärtuse Tõene.

Kausta kustutamine

PHP-s saab tühja kausta kustutada funktsiooni rmdir abil. Parameeter dirname määrab ka kustutatava kataloogi täieliku või suhtelise tee:

rmdir( "minu kaust");

rmdir("kaust1/kaust2/minukaust");

Kõigil neil juhtudel kustutatakse ainult kaust "minu kaust". Kui kausta pole või tee on valesti määratud, kuvatakse tõrketeade:

Hoiatus: rmdir(minukaust): sellist faili ega kataloogi pole ...

Mittetühja kausta kustutamine

Mittetühja kataloogi kustutamiseks kustutatakse järjestikku kaustas olevad alamfailid funktsiooniga Unlink ning seejärel kustutatakse tühi kaust funktsioon rmdir. Selleks saate kasutada sellist funktsiooni:

funktsioon my_delete_dir($mypath)(
$kataloog = avakataloog($minuteed);
while (($ fail = readdir($dir)))(
if (on_fail($mypath."/" .$file))
unlink($mypath. "/" .$fail);
elseif (is_kataloog($minutee."/" .$fail) && ($fail != "." ) && ($fail != ".." ))
minu_kustutamise_kataloog($minuteed."/" .$fail);
}
Suletudir($dir);
rmdir($minuteed);
}

my_delete_dir("minu kaust" ); // funktsiooni kutse

Kataloogi olemasolu kontrollimine

Enne enamiku kataloogidega toimingute tegemist tasub kontrollida, kas need on olemas. Selleks kasutatakse funktsiooni file_exists.

Lisaks peate veenduma, et määratud objekt on kaust, mitte fail - funktsioon is_dir. Skannitav kaust määratakse suhtelise või täieliku teega.

if (file_exists("minu kaust"))
kaja "Määratud kaust on olemas";
muidu
kaja "Määratud kausta pole olemas";

if (is_kataloog("minu kaust"))
kaja "Määratud kausta objekt";
muidu
kaja "Määratud objekt ei ole kaust";

Andmebaaside laialdane kasutamine ei ole muutnud tavalist failisüsteemi tähtsusetuks. Failide kirjutamine ja lugemine võtab ikka aega märkimisväärne koht programmeerimises.

Faili olemasolu kontrollimise algoritmid võimaldavad teil koodi täitmisel vigu vältida. PHP file_exists funktsioon pakub lihtsat lahendust faili või kataloogi olemasolu kontrollimiseks.

Funktsiooni file_exists süntaks ja kasutamine

Funktsiooni tulemus on tõene või väär. Ainus parameeter on faili nimi ja tee selleni. Funktsiooni tulemus salvestatakse vahemällu, sest kui PHP fail_exists ei tööta, kuid fail on tegelikult olemas, on tegu algoritmi veaga.

Funktsiooni clearstatcache() abil saate juurdepääsetava failisüsteemi oleku uurimisel vältida paljusid lõkse. Kuid tuleb meeles pidada, et olematu peal PHP fail file_exists tagastab väärtuse false, kuni kõnealune fail on loodud, ja seejärel tagastab tõene isegi siis, kui see on juba kustutatud.

Funktsiooni clearstatcache() ja failisüsteemiga seotud funktsioonide (näiteks is_writable(), is_readable(), is_executable(), is_file(), is_dir() jt) õige kombinatsioon võimaldab vältida "peidetud" skripti täitmist vead.

Vahemällu salvestamine parandab oluliselt süsteemi jõudlust, kuid mõnel juhul olulised failid võib luua tõeliselt ebausaldusväärse tulemuse ja põhjustada tõsise, raskesti tuvastatava käitusaja vea.

PHP funktsiooni parameeter file_exists

PHP-d saab installida erinevatele arvutusplatvormidele ja seetõttu võivad tee ja failinimed olla erinevad.

Dokumentatsioon kinnitab, et millal PHP kontroll keskendub pigem UID-le/GID-ile kui tõhusatele identifikaatoritele. Algoritmi väljatöötamine kasutades PHP-d file_exists, peaksite pöörama tähelepanu mitte ainult õigetele kaldkriipsudele (edasi või tagasi), faili tee kodeeringule ja faili enda nimele, vaid kontrollima ka nõutud suurtähtede olemasolu, õigeid märke, juurdepääsuõigusi ja muud asjaolud.

Sees negatiivne tulemus Skriptifaili kodeering võib muutuda ja andmebaasist hangitud märgistring võib vajada teisendamist.

Funktsiooni kasutamine praktikas

Rakendused PHP skriptid erinevad oluliselt. See ei tähenda, et PHP faili_exists kasutatakse ainult salvestamiseks süsteemiteave, andmefailid, objektid või dünaamiliselt loodud pildid.

Oja moodustamise kasutamise juhtumeid on sageli suured mahud ajutine teave, mida ei ole tõhus kohe andmebaasi paigutada. Teave erinevatelt külastajatelt võib saidile voolata ja seda alles pärast teatud perioodi eeltöötlust vajalikku teavet tuleb panna andmebaasi tabelitesse.

Lugemine süsteemifailid võib põhjustada vahemällu salvestamist, kui lehte mitu korda värskendatakse, või valed tegevused külastaja. Tegelikkuses on olukordi päris palju, aga õige kasutamine funktsioonide abil saate kirjutada turvalist ja usaldusväärset koodi.

Mõnikord peate kontrollima, kas määratud fail on olemas või mitte, näiteks selleks, et hiljem failiga teatud toiminguid teha.

Selle probleemiga puutusin kokku ka moodulit arendades. Ja leidsin kaks võimalust probleemi lahendamiseks.

Faili olemasolu kontrollimine URL-i lingi abil

PHP-s on funktsioon " fopen", mida saab kasutada määratud URL-i avamiseks.

Mida me teeme? Proovime faili avada ja kui see õnnestub, siis fail on olemas, vastasel juhul faili pole olemas.

Rakendamine:

Aga mis siis, kui meil pole mitte üks fail, vaid mitu nii-öelda linkide massiivi? Just see ülesanne seisis minu ees algusest peale. Ja selle probleemi lahendus on järgmine:

Sel juhul saame loendi ainult olemasolevatest failidest.

Kohaliku faili olemasolu kontrollimine

Sõna "kohalik" tähendab, et skript ja kontrollimiseks mõeldud failid asuvad samas serveris. Kui teil on üsna suur linkide hulk, on see valik probleemi lahendamiseks parim, kuna me ei esita päringut kolmanda osapoole serverile, vaid kontrollime määratud katalooge.

See meetod kasutab funktsiooni "file_exists" ja analoogselt eelmise valikuga asendab lihtsalt osa skriptist:

Ja sama ka lingimassiivi kohta:

Mida see väärt on tähelepanu pöörama? Asjaolu, et see meetod on mugav meie failisüsteemis asuvate failide käitamiseks. Seetõttu on soovitatav märkida kõik lingid suhtelistena.

Muide, ühte tellimust tehes sain just selle meetodiga vaid paari sekundiga läbi skannida umbes 135 000 faili.