Semak kewujudan fail. Bagaimana untuk menyemak sama ada fail wujud dalam PHP

Ada kalanya anda perlu menyemak sama ada ada fail yang ditentukan atau tidak, sebagai contoh, untuk melaksanakan beberapa tindakan dengan fail itu.

Saya juga menghadapi masalah ini semasa membangunkan modul. Dan saya menemui dua penyelesaian kepada masalah itu.

Menyemak kewujudan fail melalui URL

Dalam PHP terdapat fungsi " fopen”, yang boleh membuka URL yang ditentukan.

Apa yang kita buat? Kami cuba membuka fail, dan jika kami berjaya, maka fail itu wujud, jika tidak, fail itu tidak wujud.

Pelaksanaan:

Tetapi bagaimana jika kita tidak mempunyai satu fail, tetapi beberapa, boleh dikatakan, pelbagai pautan? Ini betul-betul tugas yang pada asalnya di hadapan saya. Dan penyelesaian kepada masalah ini adalah seperti berikut:

Dalam kes ini, kami mendapat senarai hanya fail yang wujud.

Menyemak Kewujudan Fail Setempat

Perkataan "tempatan" bermaksud bahawa skrip dan fail yang akan disemak terletak pada pelayan yang sama. Jika anda mempunyai cukup susunan besar pautan - pilihan ini adalah yang terbaik untuk menyelesaikan masalah, kerana kami tidak membuat permintaan untuk pelayan pihak ketiga, dan mengimbas direktori yang ditentukan.

Kaedah ini menggunakan fungsi "file_exists", dan dengan analogi dengan versi terdahulu cuma gantikan sebahagian daripada skrip:

Dan sama untuk pelbagai pautan:

Apa yang patut Nota? Hakikat bahawa kaedah ini mudah untuk menjalankan fail yang ada dalam kami sistem fail. Oleh itu, adalah wajar untuk menunjukkan semua pautan relatif.

Ngomong-ngomong, semasa membuat salah satu pesanan, dengan cara ini saya berjaya mengimbas kira-kira 135,000 fail dalam masa beberapa saat sahaja.

Parameter yang diperlukan untuk fungsi ini ialah nama laluan, yang menentukan laluan ke direktori yang akan dibuat.

mkdir( "Fail baharu" );

Jika anda menentukan folder dengan cara ini, ia akan dibuat dalam direktori yang sama dari mana skrip php dilancarkan. Jika anda ingin membuat direktori di lokasi lain, anda boleh menentukan laluan relatif ke folder yang dibuat atau tentukan laluan penuh daripada direktori akar tapak.

mkdir( "../Fail baharu" ); // satu tahap ke bawah

mkdir("/folder1/folder2/newfolder"); // laluan penuh

Dalam contoh terakhir prasyarat akan ada kewujudan subdirektori "folder1" dan "folder2". Jika mereka tidak ada, fungsi, dalam bentuk ini, tidak akan dapat mencipta folder dan akan mengembalikan ralat:

Amaran: mkdir() : Tiada fail atau direktori sedemikian dalam …

Apabila berjaya, fungsi itu kembali nilai sebenar. Jika pek belum dibuat, False akan dikembalikan.

jika (mkdir("folder baharu"))
bergema "Folder berjaya dibuat";
lain
bergema "Folder tidak dibuat";

Tetapi anda tidak sepatutnya menggunakan fungsi ini tanpa menyemak kehadiran folder, kerana pelayan masih akan memaparkan ralat bahawa folder itu tidak dapat dibuat.

Memberikan hak semasa membuat folder

Parameter pilihan kedua bagi fungsi mkdir bertanggungjawab untuk memberikan hak kepada folder yang dibuat. Secara lalai, keistimewaan maksimum yang diberikan ialah 0777.

Kebenaran ditetapkan sebagai nilai perlapanan dengan sifar mandatori di tempat pertama. Tanpa mengira sifar pertama, nombor menunjukkan tahap akses untuk pemilik, untuk kumpulan pemilik, untuk orang lain.

0 – akses ditolak;

1 – akses baca;

2 – akses tulis;

4 – akses pelaksanaan.

Selalunya, hak ditentukan sebagai jumlah komposit, sebagai contoh:

7 – akses penuh (1+2+4);

5 - membaca dan melaksanakan (1 + 4).

mkdir( "folder baharu", 0777); // akses penuh untuk semua orang

Mencipta Berbilang Subdirektori Bersarang

Anda boleh mencipta beberapa subfolder sekaligus dengan hanya menetapkan satu lagi parameter boolean pilihan - rekursif.

mkdir("folder1/folder2/newfolder" , 0777, True ); // akses penuh untuk semua orang

Dalam kes ini, jika folder "folder1" dan "folder2" tidak wujud, fungsi akan menciptanya dan folder "newfolder". Mesej ralat, jika tiada masalah lain, tidak akan dipaparkan dan fungsi akan kembali Benar.

Memadam folder

Folder kosong dalam PHP boleh dialih keluar dengan fungsi rmdir. Parameter diname juga menentukan laluan penuh atau relatif kepada direktori untuk dipadamkan:

rmdir( "folder saya" );

rmdir("folder1/folder2/myfolder");

Dalam setiap kes ini, hanya folder "myfolder" dipadamkan. Jika folder tidak wujud atau laluan ditetapkan secara tidak betul, ralat akan dipaparkan:

Amaran: rmdir(myfolder): Tiada fail atau direktori sedemikian dalam …

Memadamkan folder yang tidak kosong

Memadam direktori bukan kosong dilakukan dengan memadamkan fail bersarang dalam folder secara berurutan dengan fungsi nyahpaut, dan kemudian memadam folder kosong fungsi rmdir. Untuk melakukan ini, anda boleh menggunakan fungsi seperti ini:

fungsi my_delete_dir($mypath)(
$dir = opendir($mypath);
manakala (($fail = readdir($dir)))(
if (is_file ($mypath."/" .$file))
nyahpaut ($mypath. "/" .$file);
elseif (is_dir($mypath."/" .$file) && ($fail != "." ) && ($fail != ".." ))
my_delete_dir ($mypath."/" .$file);
}
closedir($dir);
rmdir($mypath);
}

my_delete_dir("myfolder"); // panggilan fungsi

Menyemak sama ada Direktori Wujud

Sebelum kebanyakan operasi direktori, anda perlu menyemak sama ada ia wujud. Fungsi file_exists digunakan untuk ini.

Di samping itu, anda perlu memastikan bahawa objek yang dinyatakan ialah folder, dan bukan fail - fungsi is_dir. Folder yang disemak ditentukan oleh laluan relatif atau penuh.

if (file_exists("myfolder"))
bergema "Folder yang dinyatakan wujud";
lain
bergema "Folder yang dinyatakan tidak wujud";

jika (is_dir("folder saya"))
bergema "Objek folder yang ditentukan";
lain
bergema "Objek yang dinyatakan bukan folder";

Penggunaan pangkalan data yang meluas tidak menjadikan sistem fail konvensional tidak penting. Menulis dan membaca fail masih mengambil masa tempat yang penting dalam pengaturcaraan.

Algoritma untuk menyemak kewujudan fail membolehkan anda mengelakkan ralat semasa melaksanakan kod. Fungsi PHP file_exists menawarkan penyelesaian mudah untuk menyemak kewujudan fail atau direktori.

Sintaks dan penggunaan fungsi file_exists

Hasil daripada fungsi adalah benar atau salah. Satu-satunya parameter ialah nama fail dan laluan kepadanya. Hasil fungsi dicache kerana jika file_exists PHP tidak berfungsi, tetapi fail itu sebenarnya wujud, maka ia adalah ralat algoritma.

Dengan menggunakan fungsi clearstatcache(), banyak ralat dalam memeriksa keadaan sistem fail yang tersedia boleh dielakkan. Tetapi ia harus diingat bahawa pada yang tidak wujud fail PHP file_exists akan kembali palsu sehingga fail yang dipersoalkan telah dibuat, dan kemudian kembali benar walaupun ia telah dipadamkan.

Gabungan yang betul bagi fungsi clearstatcache() dan fungsi berkaitan sistem fail (contohnya, is_writable(), is_readable(), is_executable(), is_file(), is_dir() dan lain-lain) membolehkan anda mengelakkan pelaksanaan skrip "tersembunyi" kesilapan.

Caching sangat meningkatkan prestasi sistem, tetapi dalam beberapa kes fail penting boleh mencipta hasil yang benar-benar tidak boleh dipercayai dan menyebabkan ralat pelaksanaan yang serius dan sukar ditemui.

Parameter fungsi fail_wujud PHP

PHP boleh dipasang pada platform pengkomputeran yang berbeza dan oleh itu laluan dan penamaan fail boleh berbeza.

Dokumentasi mengisytiharkan bahawa Pengesahan PHP memfokuskan pada UID/GID, bukan pengecam yang berkesan. Membangunkan algoritma penggunaan PHP file_exists, anda harus memberi perhatian bukan sahaja kepada garis miring yang betul (ke hadapan atau ke belakang), pengekodan laluan fail dan nama fail itu sendiri, tetapi juga untuk menyemak kes yang betul, aksara yang betul, hak akses dan keadaan lain .

hidup hasil negatif pengekodan fail skrip mungkin terjejas, mungkin perlu menukar rentetan aksara yang diterima daripada pangkalan data.

Aplikasi fungsi dalam amalan

Kawasan kegunaan Skrip PHP berbeza dengan ketara. Ini bukan untuk mengatakan bahawa PHP file_exists digunakan semata-mata untuk penyimpanan maklumat sistem, fail data, objek atau imej dinamik.

Kes kerap menggunakan pembentukan penstriman jumlah yang besar maklumat sementara yang tidak cekap untuk segera dimasukkan ke dalam pangkalan data. Maklumat daripada pelawat yang berbeza boleh berduyun-duyun ke tapak, dan hanya selepas pemprosesan awal untuk tempoh masa tertentu maklumat yang diperlukan mesti diletakkan dalam jadual pangkalan data.

Membaca fail sistem boleh menyebabkan caching pada berbilang halaman muat semula, atau tindakan yang salah pelawat. Terdapat banyak situasi dalam realiti, tetapi dengan penggunaan yang betul fungsi, ia membolehkan anda menulis kod yang selamat dan boleh dipercayai.

Terdapat kes apabila anda perlu menyemak sama ada fail yang ditentukan wujud atau tidak, sebagai contoh, untuk melaksanakan beberapa tindakan dengan fail itu.

Saya juga menghadapi masalah ini semasa membangunkan modul. Dan saya menemui dua penyelesaian kepada masalah itu.

Menyemak kewujudan fail melalui URL

Dalam PHP terdapat fungsi " fopen”, yang boleh membuka URL yang ditentukan.

Apa yang kita buat? Kami cuba membuka fail, dan jika kami berjaya, maka fail itu wujud, jika tidak, fail itu tidak wujud.

Pelaksanaan:

Tetapi bagaimana jika kita tidak mempunyai satu fail, tetapi beberapa, boleh dikatakan, pelbagai pautan? Ini betul-betul tugas yang pada asalnya di hadapan saya. Dan penyelesaian kepada masalah ini adalah seperti berikut:

Dalam kes ini, kami mendapat senarai hanya fail yang wujud.

Menyemak Kewujudan Fail Setempat

Perkataan "tempatan" bermaksud bahawa skrip dan fail yang akan disemak terletak pada pelayan yang sama. Jika anda mempunyai rangkaian pautan yang agak besar, pilihan ini adalah yang terbaik untuk menyelesaikan masalah, kerana kami tidak membuat permintaan kepada pelayan pihak ketiga, tetapi mengimbas direktori yang ditentukan.

Kaedah ini menggunakan fungsi "file_exists", dan, dengan analogi dengan versi sebelumnya, hanya menggantikan sebahagian daripada skrip:

Dan sama untuk pelbagai pautan:

Apa yang patut Nota? Bahawa kaedah ini mudah untuk menjalankan fail yang berada dalam sistem fail kami. Oleh itu, adalah wajar untuk menunjukkan semua pautan relatif.

Ngomong-ngomong, semasa membuat salah satu pesanan, dengan cara ini saya berjaya mengimbas kira-kira 135,000 fail dalam masa beberapa saat sahaja.