Rumah >pembangunan bahagian belakang >tutorial php >PHP Master | Senaraikan fail dan direktori dengan PHP
<code>---manager | ---user | ---document.txt | ---data.dat | ---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt</code>mata utama
glob()
, opendir()
, readdir()
, closedir()
, dan scandir()
. Fleksibiliti fungsi ini berbeza-beza, dan ada yang memerlukan penapisan selepas penapisan. FilesystemIterator
, RecursiveDirectoryIterator
, dan GlobIterator
. Iterator ini boleh diperluaskan untuk memenuhi keperluan khusus. glob()
adalah penyelesaian satu baris yang membolehkan penapisan, tetapi kekurangan fleksibiliti. Sebaliknya, opendir()
, readdir()
dan closedir()
memberikan fleksibiliti yang lebih besar, tetapi memerlukan lebih banyak kod verbose dan pasca penapisan. scandir()
juga memerlukan penapisan pasca, tetapi tidak memerlukan menguruskan pemegang fail. Untuk kaedah berorientasikan objek, perpustakaan SPL harus digunakan. GlobIterator
membolehkan pra-penapisan, manakala pengarah lain boleh menggunakan RegexIterator
untuk mencapai fungsi yang sama. Kaedah pertama menunjukkan penggunaan fungsi glob()
, gabungan fungsi opendir()
, readdir()
dan closedir()
, dan penggunaan fungsi scandir()
.
glob()
Fungsi pertama yang akan dibincangkan adalah glob()
, yang membolehkan kita mencari nama jalan menggunakan wildcard yang serupa dengan shell yang paling terkenal. Fungsi ini mempunyai dua parameter:
$pattern
(diperlukan): mod carian $flags
(pilihan): Satu atau lebih bendera yang disenaraikan dalam dokumentasi rasmi mari kita lihat beberapa contoh! Untuk mencari semua fail dan direktori yang berakhir dengan *.txt
dalam direktori, anda boleh menulis:
<code class="language-php"><?php $filelist = glob("*.txt");</code>
Jika anda menunjukkan $filelist
, output akan menjadi:
<code>array ( 0 => 'article.txt', 1 => 'text.txt' )</code>
Jika anda mahukan senarai fail dan direktori bermula dengan "te", kod yang anda ingin tulis adalah:
<code class="language-php"><?php $filelist = glob("te*");</code>
output ialah:
<code>array ( 0 => 'test.dat', 1 => 'text.txt' )</code>
hanya mendapatkan senarai direktori yang mengandungi "ma", kod tersebut adalah seperti berikut:
<code class="language-php"><?php $filelist = glob("*ma*", GLOB_ONLYDIR);</code>
Dalam contoh terakhir ini, output adalah:
<code>---manager | ---user | ---document.txt | ---data.dat | ---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt</code>
Perhatikan bahawa contoh terakhir menggunakan GLOB_ONLYDIR
tetap sebagai parameter kedua pilihan. Seperti yang anda lihat, fail bernama master.dat
dikecualikan. Walaupun fungsi glob()
mudah digunakan, ia tidak fleksibel dalam beberapa kes. Sebagai contoh, ia tidak mempunyai bendera untuk mengambil hanya fail yang sepadan dengan corak yang diberikan (bukan direktori).
opendir()
dan Kaedah kedua membaca fail dan direktori yang saya ingin bincangkan melibatkan fungsi opendir()
, readdir()
dan closedir()
. opendir()
Buka direktori dan kembali ke pemegang sambungan. Selepas pemegang diambil, anda boleh menggunakan readdir()
. Setiap kali fungsi ini dipanggil, ia memberikan nama fail atau direktori seterusnya dalam direktori terbuka. Selepas semua nama diambil, fungsi pulangan false
. Untuk menutup pemegang, anda boleh menggunakan closedir()
. Tidak seperti glob()
, pendekatan ini sedikit lebih rumit kerana anda tidak mempunyai parameter untuk membantu anda menapis fail dan direktori yang dikembalikan. Anda mesti melakukan penapisan pasca untuk mendapatkan apa yang anda mahukan. Untuk selari dengan fungsi glob()
, contoh berikut mengambil senarai semua fail dan direktori bermula dengan "te":
<code class="language-php"><?php $filelist = glob("*.txt");</code>
output adalah sama seperti dalam contoh sebelumnya. Walau bagaimanapun, jika anda melaksanakan kod di atas dan output nilai $entry
pada masa runtime, anda akan mendapati bahawa ia kadang -kadang mengandungi beberapa entri pelik: "." Ini adalah dua direktori maya yang anda akan dapati dalam setiap direktori sistem fail. Mereka mewakili direktori semasa dan direktori induk (folder sebelumnya) masing -masing. Contoh kedua menunjukkan bagaimana untuk mengambil hanya fail yang terkandung dalam laluan tertentu.
<code>array ( 0 => 'article.txt', 1 => 'text.txt' )</code>
seperti yang anda mungkin dapati, menggunakan kod di atas menghasilkan output berikut:
<code class="language-php"><?php $filelist = glob("te*");</code>
scandir()
Akhirnya, saya ingin memperkenalkan fungsi scandir()
. Ia hanya mempunyai satu parameter yang diperlukan: jalan untuk dibaca. Nilai pulangan adalah pelbagai fail dan direktori yang terkandung di dalam jalan. Seperti penyelesaian terakhir, untuk mendapatkan subset fail dan direktori, anda perlu melakukan penapis sendiri. Sebaliknya, seperti yang anda lihat dari kod di bawah, penyelesaian ini lebih mudah dan tidak memerlukan menguruskan pemegang fail. Contoh ini menunjukkan cara mengambil fail dan direktori bermula dengan rentetan "te":
<code>---manager | ---user | ---document.txt | ---data.dat | ---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt</code>
Sekarang mari kita bercakap tentang beberapa penyokong SPL. Tetapi sebelum kita menyelam ke dalam penggunaannya, izinkan saya memperkenalkan mereka dan perpustakaan SPL. SPL menyediakan pelbagai struktur data berorientasikan objek, iterators, pengendali fail, dan kelas lain. Salah satu kelebihannya ialah pengiklan adalah kelas, jadi anda boleh memanjangkannya untuk memenuhi keperluan anda dengan lebih baik. Satu lagi kelebihan ialah mereka mempunyai kaedah asli yang sangat berguna yang dapat membantu anda dengan banyak tugas umum yang mungkin anda hadapi, dan anda boleh mencari mereka di hanya satu tempat. Sebagai contoh, menggunakan readdir()
dalam FilesystemIterator
, kedua -duanya akan digunakan dalam gelung, tetapi apabila menggunakan readdir()
entri anda hanyalah rentet atau direktori mempunyai sejumlah besar maklumat (saiz, pemilik, kebenaran, dll.). Sudah tentu, PHP boleh menggunakan fungsi seperti FilesystemIterator
dan filesize()
untuk memberi anda maklumat yang sama, tetapi PHP5 telah mengubah pendekatannya kepada OOP. Oleh itu, semua nasihat saya adalah mengikuti amalan terbaik bahasa baru di sini. Jika anda memerlukan lebih banyak maklumat umum mengenai Iterator SPL, periksa menggunakan Iterator SPL. Seperti yang dinyatakan dalam pengenalan, saya akan menunjukkan penggunaan fileowner()
, FilesystemIterator
dan RecursiveDirectoryIterator
. Yang pertama mewarisi dari GlobIterator
, sementara yang lain mewarisi dari DirectoryIterator
. Mereka semua mempunyai pembina yang sama, yang hanya mempunyai dua parameter: FilesystemIterator
$path
$flags
FilesystemIterator
Menggunakan untuk mencari semua "t.dat" atau "t. Fail dan direktori yang berakhir dengan php ". FilesystemIterator
Digunakan untuk menapis lelucon lain berdasarkan ekspresi biasa. RegexIterator
RegexIterator
<code class="language-php"><?php $filelist = glob("*.txt");</code>adalah:
RegexIterator
<code>array ( 0 => 'article.txt', 1 => 'text.txt' )</code>
<code>---manager | ---user | ---document.txt | ---data.dat | ---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt</code>
RecursiveDirectoryIterator
Menyediakan antara muka untuk mengulangi direktori sistem fail. Oleh kerana sasarannya, ia mempunyai beberapa kaedah yang berguna, seperti RecursiveDirectoryIterator
dan getChildren()
, yang mengembalikan iterator untuk kemasukan semasa (jika ia adalah direktori) dan sama ada kemasukan semasa adalah direktori. Untuk menunjukkan aplikasi praktikal hasChildren()
dan RecursiveDirectoryIterator
saya akan menulis semula contoh terakhir untuk mendapatkan hasil yang sama. getChildren()
<code class="language-php"><?php $filelist = glob("*.txt");</code>
GlobIterator
. Oleh itu, parameter pertama mungkin mengandungi kad liar. Kod berikut menunjukkan contoh biasa menggunakan GlobIterator
. glob()
GlobIterator
<code>array ( 0 => 'article.txt', 1 => 'text.txt' )</code>
Fungsi
glob()
Penyelesaian yang menggunakan opendir()
sedikit verbose dan memerlukan penapisan pasca, tetapi lebih fleksibel. readdir()
Fungsi closedir()
scandir()
Jika anda mahu menggunakan kaedah OOP, anda harus menggunakan perpustakaan SPL. Di samping itu, anda boleh melanjutkan kelas untuk memenuhi keperluan anda. GlobIterator
RegexIterator
Soalan Lazim (FAQ) Mengenai Penyenaraian Fail dan Direktori Menggunakan PHP
, anda boleh menggunakan fungsi sort()
untuk mengaturnya dalam urutan menaik. Jika anda ingin menyusunnya dalam urutan menurun, anda boleh menggunakan fungsi scandir()
. Ingat untuk lulus array fail dan direktori sebagai parameter ke fungsi ini. sort()
rsort()
Bagaimana untuk mengecualikan fail atau direktori tertentu semasa menyenaraikan fail dan direktori dalam PHP?
Untuk menyenaraikan hanya direktori dan bukan fail, anda boleh menggunakan fungsi is_dir()
. Fungsi ini memeriksa sama ada jalan adalah direktori. Anda boleh menggunakan ini bersempena dengan fungsi scandir()
untuk memeriksa sama ada setiap item dalam array yang dikembalikan oleh scandir()
adalah direktori. Jika ya, anda boleh memasukkannya ke dalam senarai anda.
Untuk menyenaraikan fail dan direktori rekursif, anda boleh membuat fungsi rekursif yang menggunakan fungsi scandir()
untuk mendapatkan fail dan direktori dan kemudian memanggilnya untuk setiap direktori yang ditemui. Ini akan membolehkannya melintasi seluruh pokok direktori.
Untuk mendapatkan saiz setiap fail, anda boleh menggunakan fungsi filesize()
. Fungsi ini mengembalikan saiz fail dalam bait. Anda boleh menggunakan ini bersempena dengan fungsi scandir()
untuk mendapatkan saiz setiap fail apabila menyenaraikannya.
Untuk mendapatkan tarikh yang diubah suai terakhir untuk setiap fail, anda boleh menggunakan fungsi filemtime()
. Fungsi ini mengembalikan masa pengubahsuaian terakhir fail sebagai timestamp UNIX. Anda boleh menggunakan ini bersempena dengan fungsi scandir()
untuk mendapatkan tarikh yang diubah suai terakhir setiap fail apabila menyenaraikannya.
Untuk menapis fail dengan lanjutan, anda boleh menggunakan fungsi pathinfo()
. Fungsi ini mengembalikan maklumat mengenai laluan fail, termasuk pelanjutan. Anda boleh menggunakan ini bersempena dengan fungsi scandir()
untuk menapis fail dengan lanjutan apabila menyenaraikannya.
Untuk menyenaraikan fail dan direktori dalam direktori jauh, anda boleh menggunakan fungsi ftp_nlist()
. Fungsi ini mengembalikan senarai fail dan direktori dalam direktori yang ditentukan pada pelayan FTP. Sebelum menggunakan ftp_nlist()
, anda perlu membuat sambungan FTP menggunakan fungsi ftp_connect()
dan ftp_login()
.
Untuk mengendalikan kesilapan apabila menyenaraikan fail dan direktori, anda boleh menggunakan fungsi error_reporting()
dan set_error_handler()
. Fungsi ini membolehkan anda menetapkan tahap pelaporan ralat dan menentukan fungsi pengendali ralat tersuai yang akan dipanggil apabila ralat berlaku.
Untuk menyenaraikan fail dan direktori dalam arkib zip, anda boleh menggunakan kelas ZipArchive
. Kelas ini menyediakan kaedah untuk mengendalikan arkib zip, termasuk kaedah getFromName()
, yang membolehkan anda mengambil kandungan fail dalam arkib.
Atas ialah kandungan terperinci PHP Master | Senaraikan fail dan direktori dengan PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!