Rumah >pembangunan bahagian belakang >tutorial php >PHP Master | Senaraikan fail dan direktori dengan PHP

PHP Master | Senaraikan fail dan direktori dengan PHP

Joseph Gordon-Levitt
Joseph Gordon-Levittasal
2025-02-25 18:23:17200semak imbas

PHP Master | List Files and Directories with PHP

Artikel ini membincangkan tugas umum dalam pembangunan aplikasi PHP: penyenaraian fail dan direktori. Kami akan memperkenalkan beberapa penyelesaian asas dan maju dan menganalisis kebaikan dan keburukan mereka. Pertama, kami akan memperkenalkan tiga cara untuk menggunakan fungsi PHP asas dan kemudian beransur -ansur beralih ke cara yang lebih berkuasa untuk memanfaatkan Iterator SPL. Demi perbincangan, kami mengandaikan bahawa struktur direktori adalah seperti berikut:

<code>---manager
|
---user
|   ---document.txt
|   ---data.dat
|   ---style.css
|---article.txt
|---master.dat
|---script.php
|---test.dat
|---text.txt</code>
mata utama

    PHP menyediakan pelbagai fungsi untuk menyenaraikan fail dan direktori, termasuk
  • , glob(), opendir(), readdir(), closedir(), dan scandir(). Fleksibiliti fungsi ini berbeza-beza, dan ada yang memerlukan penapisan selepas penapisan.
  • Perpustakaan PHP standard (SPL) menyediakan penyelesaian berorientasikan objek untuk menyenaraikan fail dan direktori, termasuk FilesystemIterator, RecursiveDirectoryIterator, dan GlobIterator. Iterator ini boleh diperluaskan untuk memenuhi keperluan khusus.
  • Fungsi
  • 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.
  • Fungsi
  • 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.

Penyelesaian Asas

Kaedah pertama menunjukkan penggunaan fungsi glob(), gabungan fungsi opendir(), readdir() dan closedir(), dan penggunaan fungsi scandir().

Penggunaan 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).

Gunakan opendir() dan readdir()

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>

Penggunaan 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>

mari kita gunakan iTerator SPL

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

  • (diperlukan): Laluan projek sistem fail untuk berulang $path
  • (pilihan): Satu atau lebih bendera yang disenaraikan dalam dokumentasi rasmi $flags
Perbezaan sebenar antara iterator ini adalah dalam cara menavigasi jalan yang diberikan.

FilesystemIterator Menggunakan

sangat mudah. Untuk menunjukkan bagaimana praktikal, saya akan menunjukkan dua contoh. Dalam contoh pertama, saya akan mencari semua fail dan direktori yang bermula dengan rentetan "te", sementara contoh kedua akan menggunakan pemula lain

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

Gunakan kod di atas, hasilnya sama seperti dalam contoh sebelumnya. Contoh kedua menggunakan
<code class="language-php"><?php $filelist = glob("*.txt");</code>
adalah:

RegexIterator

Dalam kes ini, output adalah:
<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

Melangkah ke atas sistem fail dengan cara yang serupa dengan fungsi

. Oleh itu, parameter pertama mungkin mengandungi kad liar. Kod berikut menunjukkan contoh biasa menggunakan GlobIterator. glob() GlobIterator

Kesimpulan
<code>array (
  0 => 'article.txt',
  1 => 'text.txt'
)</code>

Dalam artikel ini, saya menggambarkan cara yang berbeza untuk mencapai matlamat yang sama: bagaimana untuk mengambil dan menapis fail dan direktori dalam laluan tertentu. Berikut adalah beberapa perkara penting untuk diingat:

Fungsi

    adalah penyelesaian satu baris yang membolehkan penapisan, tetapi ia tidak begitu fleksibel.
  • glob() Penyelesaian yang menggunakan
  • ,
  • dan opendir() sedikit verbose dan memerlukan penapisan pasca, tetapi lebih fleksibel. readdir() Fungsi closedir()
  • juga memerlukan penapisan pasca, tetapi tidak memerlukan pemegang pengurusan.
  • scandir() Jika anda mahu menggunakan kaedah OOP, anda harus menggunakan perpustakaan SPL. Di samping itu, anda boleh melanjutkan kelas untuk memenuhi keperluan anda.
  • Walaupun
  • mampu pra-penapisan, pemalar lain boleh menggunakan
  • untuk mencapai fungsi yang sama dengan cara yang selesa. GlobIterator RegexIterator
  • Adakah anda tahu cara lain untuk mencapai matlamat ini? Jika ya, dan anda ingin berkongsi dengan kami, sila teruskan. Perkongsian kreatif sentiasa popular.
gambar dari Fotolia

Soalan Lazim (FAQ) Mengenai Penyenaraian Fail dan Direktori Menggunakan PHP

bagaimana menyusun fail dan direktori dalam php?

boleh digunakan untuk menyusun fail dan direktori dalam PHP. Selepas mengambil fail dan direktori menggunakan fungsi

, 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?

3

Pemeriksaan fungsi sama ada nilai wujud dalam array. Anda boleh membuat pelbagai fail atau direktori untuk mengecualikan dan menggunakan fungsi

untuk memeriksa sama ada fail atau direktori wujud dalam array. Jika ia wujud, anda boleh melangkauinya.

Bagaimana untuk menyenaraikan direktori hanya dalam PHP dan bukan fail?

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.

Bagaimana untuk menyenaraikan fail dan direktori dalam PHP?

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.

bagaimana saya mendapatkan saiz setiap fail dalam php semasa menyenaraikan fail?

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.

bagaimana saya mendapat tarikh yang diubah suai terakhir setiap fail dalam php semasa menyenaraikan fail?

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.

Bagaimana untuk menapis fail dengan lanjutan apabila menyenaraikan fail dalam PHP?

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.

Bagaimana untuk menyenaraikan fail dan direktori dalam direktori jauh di PHP?

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().

Bagaimana menangani kesilapan semasa menyenaraikan fail dan direktori dalam PHP?

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.

Bagaimana untuk menyenaraikan fail dan direktori dalam arkib zip dalam php?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn