28.06.2024
Rumah / Konsol permainan / Php dapatkan file yang terakhir ditambahkan di subfolder. Mendapatkan daftar file dan direktori menggunakan PHP. Menggunakan SPL Iterator

Php dapatkan file yang terakhir ditambahkan di subfolder. Mendapatkan daftar file dan direktori menggunakan PHP. Menggunakan SPL Iterator

Dalam pelajaran ini kita akan membahas tugas umum yang muncul saat mengerjakan proyek PHP: mendapatkan daftar file dan direktori. Kami akan membahas beberapa pendekatan dasar dan lebih canggih, serta mencantumkan kelebihan dan kekurangan masing-masing pendekatan. Tiga solusi pertama akan menggunakan fungsi PHP standar, dan kemudian kami akan memperkenalkan solusi yang lebih kuat menggunakan iterator SPL.

Untuk tujuan pembahasan substantif mengenai solusi dan demonstrasi, kami berasumsi bahwa struktur direktori adalah sebagai berikut:

\---manajer | \---pengguna | \---dokumen.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Solusi dasar

Kumpulan solusi pertama didasarkan pada penggunaan fungsi glob(), kombinasi fungsi opendir() , readdir() dan closeir(), dan juga fungsi scandir().

Menggunakan gumpalan()

Solusi pertama didasarkan pada penggunaan fungsi glob(), yang memungkinkan Anda mencari jalur menggunakan pola. Fungsi ini memiliki dua parameter:

  • $pattern (wajib): pola pencarian
  • $flags (opsional): satu atau lebih flag, deskripsinya dapat ditemukan di dokumentasi

Mari kita lihat contohnya. Untuk mencari direktori untuk semua file dan direktori yang namanya diakhiri dengan .txt, Anda harus menggunakan kode:

Jika kita menampilkan variabel $filelist, kita mendapatkan:

Larik (0 => "artikel.txt", 1 => "teks.txt")

Jika Anda memerlukan daftar file dan direktori yang namanya dimulai dengan “te”, maka kodenya akan terlihat seperti ini:

Dan hasilnya terlihat seperti:

Larik (0 => "test.dat", 1 => "teks.txt")

Dan untuk mendapatkan daftar hanya direktori dengan nama yang mengandung “ma”, gunakan kode:

Contoh terakhir akan menampilkan:

Larik (0 => "manajer")

Perhatikan bahwa contoh terakhir menggunakan flag GLOB_ONLYDIR sebagai parameter kedua dari fungsi tersebut. Oleh karena itu, file master.dat dikecualikan dari daftar. Meskipun fungsi glob() sangat mudah digunakan, terkadang fungsi tersebut kurang fleksibel. Misalnya, tidak ada tanda untuk hanya mendapatkan file (tidak ada direktori) yang cocok dengan polanya.

Kami menggunakan opendir() , readdir() , dan closeir() .

Pendekatan kedua untuk mendapatkan daftar file dan direktori yang akan kita bahas adalah dengan menggunakan fungsi opendir() , readdir() , dan closeir() .

Fungsi opendir() membuka direktori dan mengembalikan pegangan koneksi. Setelah pegangan diperoleh, fungsi readdir() dapat digunakan. Dengan setiap panggilan, fungsi ini mengembalikan nama file atau direktori berikutnya dalam direktori terbuka. Jika semua nama telah dicantumkan, fungsi akan kembali PALSU. Fungsi closeir() digunakan untuk menutup pegangan.

Berbeda dengan penggunaan fungsi glob(), pendekatan ini lebih kompleks karena Anda tidak memiliki parameter untuk membantu memfilter daftar nama file dan direktori yang dikembalikan. Anda harus melakukan pemfilteran sendiri untuk mendapatkan hasil yang Anda inginkan.

Contoh berikut mengembalikan daftar nama file dan direktori yang dimulai dengan “te”:

Saat menjalankan kode di atas, variabel $entry akan berisi penyertaan seperti “.” Dan "..". Ini adalah dua direktori virtual yang ada di setiap direktori berkas sistem. Mereka masing-masing mewakili direktori saat ini dan direktori induk.

Contoh kedua hanya menampilkan file yang terdapat dalam direktori tertentu.

Contohnya akan menghasilkan yang berikut:

Array (0 => "artikel.txt", 1 => "master.dat", 2 => "script.php", 3 => "test.dat", 4 => "teks.txt")

Menggunakan scandir()

Terakhir, mari perkenalkan fungsi scandir(). Ini hanya memiliki satu parameter yang diperlukan: jalur membaca. Fungsi ini mengembalikan array file dan direktori yang terletak di jalur yang ditentukan. Untuk mendapatkan daftar file dan direktori berdasarkan kriteria tertentu, Anda perlu melakukan pemfilteran tambahan. Di sisi lain, solusinya lebih ringkas dan tidak memerlukan manajemen penanganan.

Contoh ini menunjukkan cara mendapatkan daftar file dan direktori yang namanya dimulai dengan “te”:

Mari kita gunakan iterator SPL

Sekarang mari kita lihat penggunaan iterator SPL. Namun sebelum kita mulai memecahkan masalah kita, mari kita kenali perpustakaan SPL dan iteratornya. Pustaka SPL menyediakan serangkaian kelas untuk struktur data berorientasi objek, iterator, deskriptor file, dan banyak lagi.

Salah satu keuntungan dari iterator adalah bahwa mereka berkelas dan dapat diperluas sesuai dengan kebutuhan Anda. Keuntungan lainnya adalah iterator memiliki metodenya sendiri, yang berguna untuk menyelesaikan banyak masalah umum dan berlokasi di satu tempat. Lihatlah contoh penggunaan FilesystemIterator versus readdir() . Kedua metode tersebut menggunakan loop, tetapi dengan readdir() Anda hanya memproses string, sedangkan FilesystemIterator bekerja dengan objek yang dapat berisi informasi tambahan tentang file atau direktori (ukuran, pemilik, izin, dan sebagainya).

Tentu saja, PHP menyediakan kemampuan untuk memperoleh informasi tersebut menggunakan fungsi seperti filesize() dan fileowner(). Tapi PHP5 didasarkan pada penggunaan konsep OOP. Oleh karena itu lebih baik digunakan metode modern bekerja dengan bahasa pemrograman. Ada pelajaran tentang bekerja dengan iterator di situs web kami.

Seperti yang telah dilaporkan di bagian awal tutorial, kita akan melihat penggunaan FilesystemIterator, RecursiveDirectoryIterator, dan GlobIterator. Yang pertama mewarisi dari DirectoryIterator dan sisanya dari FilesystemIterator . Semuanya memiliki konstruktor yang sama, yang mengambil dua parameter:

  • $path (wajib): jalur ke entri sistem file tempat operasi dilakukan
  • $flags (opsional): satu atau lebih flag yang tercantum dalam dokumentasi

Perbedaan sebenarnya dari iterator ini adalah cara mereka digunakan untuk menavigasi jalur tertentu.

FilesystemIterator

Menggunakan FilesystemIterator sangat sederhana. Mari kita lihat aksinya. Kami menyajikan dua contoh. Yang pertama menunjukkan pencarian untuk semua file dan direktori yang namanya dimulai dengan “te”. Contoh kedua menggunakan RegexIterator lain untuk menemukan semua file dan direktori yang namanya diakhiri dengan “t.dat” atau “t.php”. RegexIterator digunakan untuk memfilter hasil berdasarkan ekspresi reguler.

getFilename(), "te") === 0) ( $filelist = $entry->getFilename(); ) )

Kode di atas akan menghasilkan hasil yang mirip dengan contoh sebelumnya.

Contoh kedua menggunakan RegexIterator:

dapatkan Nama File(); )

Ini akan menghasilkan:

Larik (0 => "script.php", 1 => "test.dat")

Direktori RekursifIterator

RecursiveDirectoryIterator menyediakan antarmuka untuk melintasi direktori sistem file secara rekursif. Ia memiliki beberapa metode yang berguna, seperti getChildren() dan hasChildren(), yang mengembalikan iterator untuk lokasi saat ini jika itu adalah sebuah direktori, dan memeriksa apakah titik masuk saat ini adalah sebuah direktori. Contoh berikut menunjukkan penggunaan RecursiveDirectoryIterator dan getChildren() . Hasilnya akan sama seperti contoh sebelumnya.

getChildren(), "/t\.(php|dat)$/"); $daftar file = array(); foreach($filter sebagai $entry) ( $filelist = $entry->getFilename(); )

GlobIterator

GlobIterator melakukan iterasi melalui sistem file dengan cara yang sama seperti fungsi glob(). Parameter pertama mungkin menyertakan templat untuk namanya. Contoh tersebut menunjukkan penggunaan GlobIterator dengan hasil yang sama seperti sebelumnya.

dapatkan Nama File(); )

Kesimpulan

Pelajaran ini mendemonstrasikan penggunaan pendekatan berbeda untuk mencapai tujuan yang sama: mendapatkan daftar file dan direktori. Poin-poin penting berikut harus diingat:

  • Fungsi glob() adalah solusi bawaan, tetapi tidak cukup fleksibel.
  • Solusi berdasarkan opendir() , readdir() , dan closeir() lebih kompleks dan memerlukan pemfilteran tambahan, namun lebih fleksibel.
  • Fungsi scandir() memerlukan pemfilteran tambahan, tetapi berfungsi tanpa memproses pegangannya.
  • Jika Anda menggunakan pendekatan OOP, Anda harus menggunakan perpustakaan SPL. Selain itu, Anda dapat memperluas kelas dengan fungsi Anda sendiri.
  • GlobIterator memiliki fitur pra-pemfilteran, sementara yang lain menggunakan RegexIterator.

Reg.ru: domain dan hosting

Pendaftar dan penyedia hosting terbesar di Rusia.

Lebih dari 2 juta nama domain dalam layanan.

Promosi, email domain, solusi bisnis.

Lebih dari 700 ribu pelanggan di seluruh dunia telah menentukan pilihannya.

*Arahkan mouse untuk menjeda pengguliran.

Mundur ke depan

Mendapatkan daftar folder menggunakan PHP

Daftar direktori menggunakan PHP, atau daftar direktori

Kami akan menyebut daftar direktori sebagai kueri umum yang menghasilkan daftar semua atau beberapa file dan direktori dari direktori induk - sebuah proses yang mirip dengan pekerjaan halaman indeks yang disediakan oleh sebagian besar server web, tetapi dengan HAI Kontrol yang lebih besar atas konten dan formatnya.

Keunggulan lain dari skrip ini adalah kemampuan untuk melakukan tindakan tertentu dengan file menggunakan PHP. Bagaimanapun, langkah pertama yang perlu kita lakukan adalah menanyakan sistem file - mengembalikan daftar file dan direktori.

Fungsi yang disajikan di bawah ini memungkinkan Anda mengekstrak nama file dan properti lain dari direktori tertentu, atau melakukan iterasi melalui subkategori secara rekursif.

Komentar: PHP5 memiliki fungsi scandir, yang “mengembalikan daftar file dan direktori di dalam direktori pada jalur tertentu,” tetapi tidak menampilkan informasi tambahan apa pun tentang file di dalam direktori.

Daftar satu direktori

Untuk memulainya, berikut adalah contoh fungsi sederhana yang mengembalikan daftar file, direktori, dan propertinya dari satu direktori (Anda akan menemukan versi lebih lanjut dari fungsi ini nanti dalam pelajaran ini.)

read())) ( // lewati file tersembunyi if($entry == ".") lanjutkan; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entri/", "ukuran" => 0, "lastmod" => filemtime("$dir$entry")); ) elseif(is_readable("$dir$entry")) ( $retval = array("nama" = > "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close(); kembalikan $retval; ) ?>

Anda dapat menggunakan fungsi ini seperti di bawah ini:

Nilai yang dikembalikan adalah array asosiatif file, termasuk informasi jalur file, ukuran, dan tanggal modifikasi terakhir, kecuali file tersebut adalah direktori, dalam hal ini string "(dir)" yang muncul, bukan ukuran file.

Contoh 1:

",print_r($daftardir),""; /* contoh keluaran Array ( => Array ( => images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Contoh 2:

",print_r($daftardir),""; /* contoh keluaran Array ( => Array ( => ./images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Daftar file melalui HTML

Untuk mendapatkan hasil output pada halaman dalam HTML, kita akan mengulang array yang dikembalikan

\n"; gema " NamaJenisUkuranModus Terakhir.\n"; foreach($dirlist sebagai $file) ( echo " \n"; gema " ($file["nama"])\n"; gema " ($file["ketik"])\n"; gema " ($file["ukuran"])\n"; gema " \n"; gema "\n"; ) gema "\n\n"; ?>

Kode ini cukup mudah untuk dimodifikasi, misalnya:

  • - menampilkan hasil daftar sebagai daftar, bukan tabel;
  • - membuat nama file menjadi tautan aktif;
  • - ganti nama dengan ikon berdasarkan jenis filenya;
  • dll.

Misalnya, untuk mengeluarkan file PNG saja, tambahkan kondisi sederhana ke loop keluaran:

\n"; gema " NamaJenisUkuranModus Terakhir.\n"; foreach($dirlist as $file) ( //periksa apakah file tersebut adalah PNG if(!preg_match("/\.png$/", $file["name"])) lanjutkan; echo " \n"; gema " ($file["nama"])\n"; gema " ($file["ketik"])\n"; gema " ($file["ukuran"])\n"; gema " ",tanggal("r", $file["lastmod"]),"\n"; gema "\n"; ) gema "\n\n"; ?>

Contoh ini akan melewatkan dan menyembunyikan semua file yang namanya diakhiri dengan .png. Anda juga dapat menerapkan ketentuan tambahan berdasarkan jenis file, ukuran, atau tanggal terakhir diubah.

Kalau misalnya ingin menampilkan thumbnail, link ke gambar yang lebih besar, atau bahkan video, cukup beri nama yang sama pada 2 file tersebut dan pada skrip di atas gunakan str_ganti atau fungsi serupa untuk mengubah konten tautan.

Daftar direktori rekursif

Dan sejak kita sampai sejauh ini, hanya akan ada sedikit perubahan pada daftar rekursif dan fungsi pemanggilan subkategori. Dengan menambahkan parameter kedua ke fungsi tersebut, kami mempertahankan fungsionalitas sebelumnya yaitu mencantumkan satu direktori.

read())) ( // lewati file tersembunyi if($entry == ".") lanjutkan; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entri/", "ukuran" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( $retval = array_merge($ retval, getFileList("$dir$entry/", true) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size " => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close(); kembalikan $retval; ) ?>

Agar fungsi baru dapat berfungsi, Anda perlu memasukkan nilai BENAR(atau 1) sebagai parameter kedua.

Sebelum mengulangi skrip, periksa apakah subdirektori dapat dibaca dan baca juga paragraf terakhir pelajaran ini untuk menghindari kesalahan akses.

Seperti sebelumnya, nilai yang dikembalikan adalah array, array asosiatif. Faktanya, satu-satunya tambahan adalah opsi tambahan lainnya untuk daftar rekursif.

Batas Kedalaman Rekursi

Contoh terakhir ini menambahkan satu fitur lagi - kemampuan untuk menentukan seberapa "dalam" rekursi yang harus dilakukan. Kode sebelumnya akan terus menelusuri subdirektori hingga habis. Skrip ini akan membantu Anda menetapkan batas jumlah level direktori bersarang.

read())) ( // lewati file tersembunyi if($entry == ".") lanjutkan; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entri/", "ukuran" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( if($kedalaman == = false) ( $retval = array_merge($retval, getFileList("$dir$entry/", true)); ) elseif($kedalaman > 0) ( $retval = array_merge($retval, getFileList("$dir$entry /", benar, $kedalaman-1)); ) ) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close(); kembalikan $retval; ) ?>

Seperti sebelumnya, kami hanya menambahkan 1 parameter baru dan beberapa baris kode. Jika nilai default yang bertanggung jawab atas kedalaman rekursi tidak ditentukan, maka nilai tersebut disetel ke PALSU. Hal ini memungkinkan kami untuk memastikan bahwa fitur sebelumnya tetap ada dan kode berikutnya tidak akan “rusak” ketika fungsinya berubah.

Bekerja dengan file

Kebutuhan akan operasi dengan file sering kali dihadapi oleh programmer. Jika skrip Anda tidak menggunakan database, maka file adalah satu-satunya perangkat penyimpanan yang dapat diterima untuk skrip tersebut. Penggunaan file sebagai tempat penyimpanan informasi eksekusi skrip memungkinkannya digunakan dalam berbagai situasi. Hampir semua skrip penghitung untuk sesuatu ditulis berdasarkan bekerja dengan file. Anda juga bisa memberikan banyak contoh lainnya, namun inilah saatnya untuk beralih langsung dari kata ke tindakan.

Saya ingin segera mengatakan bahwa bekerja dengan file tersebut harus diotorisasi. Secara default, PHP tidak mengizinkan manipulasi file untuk alasan keamanan. Untuk menghapus larangan ini di pengelola FTP CuteFTP, centang semua kotak di properti file;

file_ada

Sebelum Anda melakukan operasi pada suatu file, Anda sering kali perlu memastikan bahwa file yang ditentukan ada. Inilah yang dilakukan fungsi file_exists. Fungsi ini hanya dapat mengembalikan dua nilai, seperti yang dapat Anda bayangkan BENAR(jika file yang ditentukan ada) dan PALSU. Biasanya, penggunaan fungsi ini terlihat seperti ini:

Harap dicatat bahwa fungsi ini hanya berfungsi pada file lokal, yaitu jika Anda ingin memeriksa apakah Yandex telah memperoleh file robot.txt, maka usaha Anda akan sia-sia. Tetapi dimungkinkan untuk memeriksa file apa pun yang terletak di server lokal, terlepas dari direktori lokasinya.

Berikut adalah beberapa aturan untuk menjelaskan jalur ke file.

ukuran file

Seperti namanya, fungsi ini menentukan ukuran file dan mengembalikannya dalam byte. Berguna jika Anda ingin memeriksa file untuk melihat apakah file tersebut berisi informasi (seperti yang Anda bayangkan, file kosong berisi 0 byte), dan Anda juga dapat memeriksa ukuran file untuk melihat apakah melebihi batas tertentu.

mengajukan

Fungsi ini sudah bekerja langsung dengan file tersebut. Ia mengembalikan konten file yang ditentukan, dan melakukan ini dalam bentuk array, di mana setiap elemen adalah baris file. Fungsi ini berguna ketika Anda perlu menyimpan beberapa nilai berbeda dalam satu file yang tidak boleh berpotongan. Kemudian setiap nilai disimpan pada baris terpisah dan dibaca oleh fungsi file, yang mengembalikan array, sehingga variabel tertentu diakses dengan membaca nilai elemen array dengan indeks yang sesuai dengan baris dalam file.

Dimungkinkan juga untuk menyatukan kembali semua elemen array yang dikembalikan ke dalam satu variabel. Hal ini dilakukan dengan menggunakan fungsi array implode.

fopen

Jika fungsi sebelumnya berdiri sendiri dan umumnya tidak terkait dengan fungsi lain, maka fungsi berikutnya untuk bekerja dengan file berfungsi bersama dengan fopen . Fungsi ini membuka file yang ditentukan dan mengembalikan pengidentifikasi koneksi file, yang digunakan untuk tujuan layanan. Fungsi ini sama sekali tidak berhubungan dengan isi file.

Fungsi fopen memiliki beberapa mode untuk bekerja dengan file. Mereka ditunjukkan setelah nama file dan adalah sebagai berikut:

    "R"
    File dibuka untuk membaca isinya saja.

    "r+"
    Membuka file untuk membaca dan menulis.

    "w"
    File dibuka untuk tujuan penulisan.

    "w+"
    Buka file untuk membaca dan menulis.

    "A"
    File dibuka untuk penulisan sampai akhir file (append).

    "sebuah +"
    Terbuka untuk menulis dan membaca lebih lanjut.

fgets

Fungsi untuk membaca file yang dibuka dengan fungsi fopen. Namun tidak seperti file, fungsi ini hanya mengembalikan satu baris file setiap kali dijalankan, dan memindahkan penunjuk file internal ke baris berikutnya, yang akan dibaca saat fungsi tersebut dipanggil lagi. Oleh karena itu, jika Anda perlu membaca seluruh file, Anda harus menggunakan fungsi ini dalam satu lingkaran.

Perhatikan bahwa fungsi fgets menggunakan parameter panjang tambahan, yang menentukan panjang maksimum baris file yang akan dibaca. Jika ukuran string melebihi angka ini, maka fungsi akan mengembalikannya dalam bentuk byte panjang yang “terpotong”. Secara default, parameter ini diatur ke 1024 byte, atau satu kilobyte. Berikan perhatian khusus pada parameter ini jika Anda menggunakan file besar, karena saat membaca file tersebut, buffer eksekusi PHP mungkin meluap (ukurannya ditunjukkan dalam file konfigurasi), yang akan menyebabkan pembekuan.

Perhatikan bahwa file yang akan dibaca bukanlah nama file, tetapi pengenal koneksi file yang dikembalikan oleh fungsi fopen (dalam contoh kita, nilai variabel $file).

hasil

Fungsi menulis informasi ke suatu file, dan melakukannya sesuai dengan prinsip pengoperasian fungsi fgets, yaitu mulai menulis dari posisi penunjuk file internal. Secara umum, fungsi ini sebagian besar mirip dengan fungsi di atas: fungsi ini juga menggunakan parameter panjang data tulis, yang juga opsional.

tutup

Seperti yang sudah Anda duga, fungsi ini menutup file yang ditentukan. Sebenarnya setelah skrip selesai, PHP sendiri menutup semua file yang terbuka, namun tetap lebih baik melakukannya secara manual. Sebagai parameter fungsi, Anda harus menentukan pengidentifikasi koneksi file.

Untuk mengilustrasikan kombinasi fungsi di atas, kami akan memberikan contoh pembuatan penghitung kunjungan sederhana.

$file = fopen("counter.txt", "r");
$c = kesalahan($file, 150);
fclose($file);
$c++;
$file = fopen("counter.txt", "w");
fput($file, $c);
fclose($file);
gema $c;
?>

Bekerja dengan direktori

Terkait erat dengan tindakan pada file adalah operasi pada direktori. Algoritme untuk bekerja dengannya mirip dengan operasi pada file: pertama Anda perlu membuka direktori, melakukan beberapa tindakan, dan terakhir, menutupnya.

opendir

Fungsi ini membuka direktori yang ditentukan dan mengembalikan pengidentifikasi layanan untuk koneksi direktori. Jalur direktori harus ditentukan sebagai berikut:

Titik berarti membuka direktori saat ini

. /file/

Membuka folder file terletak di direktori saat ini

Membuka folder satu tingkat lebih tinggi dari yang sekarang

bacadir

Fungsi membaca direktori yang dibuka oleh opendir . Untuk setiap pass, ia mengembalikan nama file atau folder yang terletak di direktori yang ditentukan dan memindahkan penunjuk internal ke objek direktori berikutnya. Jadi untuk membaca seluruh direktori harus digunakan dalam satu lingkaran.

Perlu juga dicatat bahwa fungsi ini mengembalikan objek layanan folder . Dan .. , yang dapat dipangkas saat dikeluarkan oleh pernyataan IF.

tutup

Kami menutup direktori, menentukan pengidentifikasi koneksi folder sebagai argumen.

Terkadang menggunakan fungsi direktori membuat hidup lebih mudah. Misalnya, di bagian Fitur, Anda dapat melihat daftar fitur berdasarkan abjad. Dapatkah Anda bayangkan berapa lama waktu yang diperlukan untuk menulis seluruh daftar ini secara manual dengan tautan, dan bahkan dalam urutan abjad. Dan di sinilah fungsi untuk bekerja dengan direktori membantu saya. Setiap fungsi ditempatkan dalam file terpisah dengan nama yang sesuai dengan nama fungsinya, tanpa ekstensi apa pun.

Jadi, setiap kali Anda mengunjungi halaman tersebut, Anda mendapatkan daftar fungsi yang baru dibuat.

Itu saja. Sampai jumpa di pelajaran selanjutnya.

Daftar direktori adalah proses memperoleh informasi tentang direktori dan file untuk direktori induk tertentu, serta kemampuan untuk menerapkan berbagai filter pada data ini untuk memperbaiki keluaran.

Dalam contoh ini, kami akan mencoba mengatasi tugas umum yang muncul di hampir setiap tugas PHP proyek - mendapatkan daftar direktori dan/atau file. Contoh ini menggunakan beberapa pendekatan dasar dan lebih kompleks, menguraikan kelebihan dan kekurangan masing-masing teknik. Tiga solusi pertama menggunakan fungsi standar PHP. Solusi terbaru yang lebih andal menggunakan iterator PHP SPL.


Untuk representasi yang lebih visual, kami menggunakan struktur direktori yang terlihat seperti ini:


\-Aplikasi | \-Pengguna | \-data.apk | \-style.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

Solusi dasar
Kumpulan contoh pertama menggunakan fungsi gumpal() dan kombinasi fungsi direktori terbuka(), bacadir(), tertutup(), serta fungsinya scandir().

Menggunakan gumpalan()

Contoh penggunaan fungsi php gumpal(), yang memungkinkan Anda mencari jalur menggunakan pola.
Fungsi gumpal( $pola,$bendera) beroperasi dengan dua argumen:
  • $pola(wajib): string pola pencarian
  • $bendera
    • GLOB_MARK- Menambahkan garis miring ke setiap direktori yang dikembalikan.
    • GLOB_NOSORT- Mengembalikan file dalam bentuk yang ada di direktori (tanpa penyortiran). Jika tanda ini tidak ditentukan, maka nama diurutkan berdasarkan abjad.
    • GLOB_NOCHECK- Mengembalikan pola pencarian jika tidak ada file yang ditemukan menggunakannya.
    • GLOB_NOESCAPE- Garis miring terbalik tidak luput dari karakter meta.
    • GLOB_BRACE- Memperluas (a,b,c) untuk mencocokkan "a", "b" atau "c".
    • GLOB_ONLYDIR- Hanya mengembalikan direktori yang cocok dengan polanya.
    • GLOB_ERR- Berhenti pada kesalahan baca (misalnya, direktori tanpa izin baca), secara default kesalahan diabaikan.
Untuk mencari direktori untuk semua file dan direktori yang namanya diakhiri dengan .txt, gunakan kode berikut:Pada output kita mendapatkan hasil berikut: array(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) Jika Anda perlu mendapatkan daftar file dan direktori yang namanya dimulai dengan "te":Pada output kita mendapatkan hasil sebagai berikut: array(2) ( => string(9) "test.html" => string(7) "test.js" ) Hanya mendapatkan direktori dengan nama yang mengandung "er" dalam daftar:Pada output kita mendapatkan hasil berikut: array(1) ( => string(4) "User" )

Contoh terakhir menggunakan bendera GLOB_ONLYDIR sebagai argumen kedua untuk fungsi tersebut. Oleh karena itu, hanya direktori “Pengguna” dalam namanya, yang berisi “er,” yang disertakan dalam daftar. Fungsi glob() sangat mudah digunakan, namun terkadang kurang fleksibel. Tidak ada tanda untuk hanya mendapatkan file (tidak ada direktori) yang cocok dengan polanya.

Menggunakan opendir(), readdir(), dan closeir().

Cara selanjutnya untuk mendapatkan daftar file dan direktori adalah dengan menggunakan fungsi PHP direktori terbuka(), bacadir() Dan tertutup().

Fungsi direktori terbuka() mengembalikan pegangan ke direktori terbuka. Setelah pegangan diterima, Anda dapat menggunakan fungsinya bacadir(). Saat mengakses pegangan, fungsinya bacadir() menampilkan nama file atau direktori berikutnya. Jika semua elemen yang terdapat dalam deskriptor telah disebutkan, maka fungsinya bacadir() akan kembali PALSU. Untuk menutup deskriptor kami menggunakan fungsi tertutup().


Berbeda dengan menggunakan fungsi php , pendekatan ini sedikit lebih rumit. Tidak mungkin untuk mengatur parameter pemfilteran yang membantu menghasilkan daftar nama file dan direktori yang dikembalikan terlebih dahulu. Untuk mendapatkan daftar file dan direktori yang diperlukan, pemfilteran harus dilakukan secara mandiri.


Contoh berikut mengembalikan daftar nama file dan direktori yang dimulai dengan "Kami":Outputnya adalah sebagai berikut: array(1) ( => string(4) "User" ) Contoh berikut hanya akan menampilkan file-file yang terdapat dalam direktori tertentu.Pada output kita mendapatkan hasil sebagai berikut: array(5) ( => string(10) "script.php" => string(7) "test.js" => string(9) "test.html" => string (10) "serial.txt" => string(10) "readme.txt" )

Menggunakan scandir().

Untuk menyelesaikannya, mari kita lihat contoh penggunaan fungsi php scandir(). Ia hanya memiliki satu atribut yang diperlukan - jalur ke direktori bacaan. Hasil dari fungsi ini adalah array file dan direktori yang terletak di sepanjang jalur yang ditentukan dalam argumen. Seperti pada contoh sebelumnya, untuk mendapatkan daftar file dan direktori yang difilter, Anda harus menjalankannya sendiri. Secara visual, solusinya lebih singkat dan tidak diperlukan pengelolaan deskriptor.


Contoh ini menunjukkan cara mendapatkan daftar file dan direktori yang namanya dimulai dengan "te":Pada output kita mendapatkan hasil sebagai berikut: array(2) ( => string(9) "test.html" => string(7) "test.js" )

Solusi tingkat lanjut menggunakan PHP SPL
Solusi yang lebih andal menggunakan iterator SPL FilesystemIterator, Direktori RekursifIterator Dan GlobIterator.

Menggunakan iterator SPL.

Mari kita lihat penggunaan iterator SPL. Sebelum kita mulai menyelesaikan masalah, mari kita mengenal sedikit perpustakaan PHP SPL dan iteratornya. Pustaka SPL menyediakan kumpulan kelas khusus untuk struktur data berorientasi objek, iterator, deskriptor file, dan banyak lagi.


Keuntungan utama dari iterator adalah bahwa mereka berkelas dan dapat diperluas menggunakan mekanisme standar warisan php kelas. Kelebihan lainnya adalah iterator memiliki metodenya sendiri yang berguna untuk menyelesaikan masalah umum, dan semuanya berlokasi di satu tempat. Mari kita lihat contoh penggunaannya FilesystemIterator dan bandingkan dengan bacadir(). Kedua metode menggunakan perulangan, tetapi dalam kasus bacadir() hanya string yang dapat diproses, tetapi FilesystemIterator dapat bekerja dengan suatu objek. Yang mungkin berisi informasi tambahan tentang file atau direktori seperti pemilik, ukuran, hak akses, dan lain sebagainya.


Tentu saja, PHP memiliki kemampuan untuk memperoleh informasi ini menggunakan fungsi, ukuran file(), pemilik file() dan lain-lain. Namun PHP, seperti bahasa pemrograman lainnya, memiliki kemampuan untuk berubah. Di PHP5 ada peningkatan keinginan untuk menggunakan konsep OOP. Oleh karena itu, lebih baik menggunakan metode modern dalam bekerja dengan bahasa pemrograman.


Pertimbangkan untuk menggunakan FilesystemIterator, Direktori RekursifIterator Dan GlobIterator. Iterator pertama mewarisi dari DirektoriIterator, dan sisanya dari FilesystemIterator. Semuanya memiliki konstruktor yang sama, yang membutuhkan dua argumen:

  • $jalur(wajib): jalur ke item sistem file tempat operasi dilakukan
  • $bendera(opsional): satu atau lebih bendera
    • FilesystemIterator::CURRENT_AS_PATHNAME Menyebabkan metode FilesystemIterator::current() mengembalikan jalur.
    • FilesystemIterator::CURRENT_AS_FILEINFO Menyebabkan metode FilesystemIterator::current() mengembalikan instance SplFileInfo.
    • FilesystemIterator::CURRENT_AS_SELF Menyebabkan metode FilesystemIterator::current() mengembalikan $this (FilesystemIterator).
    • FilesystemIterator::CURRENT_MODE_MASK Menyamarkan FilesystemIterator::saat ini()
    • FilesystemIterator::KEY_AS_PATHNAME Menyebabkan metode FilesystemIterator::key() mengembalikan jalur.
    • FilesystemIterator::KEY_AS_FILENAME Menyebabkan metode FilesystemIterator::key() mengembalikan nama file.
    • FilesystemIterator::FOLLOW_SYMLINKS Menyebabkan metode RecursiveDirectoryIterator::hasChildren() mengikuti tautan simbolis.
    • FilesystemIterator::KEY_MODE_MASK Menyamarkan FilesystemIterator::key()
    • FilesystemIterator::NEW_CURRENT_AND_KEY Sama seperti FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.
    • FilesystemIterator::SKIP_DOTS Melewati file titik (.dan ..).
    • FilesystemIterator::UNIX_PATHS Memaksa semua jalur untuk menggunakan garis miring terbalik gaya Unix, apa pun pengaturan default sistem.

Perbedaan antara iterator ini adalah cara mereka digunakan untuk bernavigasi di sepanjang jalur tertentu.

FilesystemIterator

Menggunakan FilesystemIterator sangat sederhana.
Contoh menunjukkan pencarian semua file dan direktori yang namanya dimulai dengan "te".

getFilename(),"te")===0): $arFileList = $obFile->getFilename(); berakhir jika; ujung depan; //Tampilkan hasilnya var_dump($arFileList); ?> Pada output kita mendapatkan hasil sebagai berikut: array(2) ( => string(7) "test.js" => string(9) "test.html" )

Contoh penggunaan iterator lain RegexIterator untuk mencari semua file dan direktori yang namanya diakhiri dengan "t.js" atau "t.php". Pengulangan RegexIterator digunakan untuk memfilter hasil dan menggunakan mesin ekspresi reguler.

dapatkan Nama File(); ujung depan; //Tampilkan hasilnya var_dump($arFileList); ?> Pada output kita mendapatkan hasil sebagai berikut: array(2) ( => string(10) "script.php" => string(7) "test.js" )

Direktori RekursifIterator

Pengulangan Direktori RekursifIterator menyediakan antarmuka untuk melintasi direktori sistem file secara rekursif. Ini memiliki beberapa metode yang berguna seperti dapatkanAnak-anak() Dan hasChildren(), yang mengembalikan iterator untuk lokasi saat ini jika itu adalah sebuah direktori, dan memeriksa apakah titik masuk saat ini adalah sebuah direktori.


Direktori RekursifIterator Dan dapatkanAnak-anak(). getChildren(), "/t\.(txt|css)$/"); $arFileList = susunan(); foreach($rxIterator sebagai $obFile): $arFileList = $obFile->getFilename(); ujung depan; //Tampilkan hasilnya var_dump($arFileList); ?> Pada outputnya kita mendapatkan hasil sebagai berikut: pada kasus ini- ini adalah file dari direktori "Pengguna": array(1) ( => string(8) "test.txt" )

GlobIterator

Pengulangan GlobIterator melakukan traversal file yang mirip dengan . Atribut pertama mungkin menyertakan pola nama.


Contoh ini menunjukkan penggunaannya GlobIterator dengan hasil yang sama seperti sebelumnya.dapatkan Nama File(); ujung depan; //Keluarkan hasilnya var_dump($arFileList); ?> Pada output kita mendapatkan hasil sebagai berikut: array(2) ( => string(10) "/test.html" => string(8) "/test.js" )

Kesimpulan

Contoh di atas telah dipertimbangkan berbagai metode PHP untuk mencapai tujuan yang sama: mendapatkan daftar file dan direktori.

Poin-poin utama berikut dapat disorot dari contoh-contoh: