Bagaimana cara mendapatkan daftar file direktori di php?

Permintaan umum adalah untuk dapat menghasilkan daftar beberapa atau semua file dalam direktori - mirip dengan halaman indeks default yang disediakan oleh sebagian besar server web, tetapi dengan kontrol lebih besar atas konten dan pemformatan

Tujuan lain mungkin untuk mengambil beberapa tindakan pada file menggunakan PHP. Dalam kedua kasus, langkah pertama adalah meminta sistem file untuk mengembalikan daftar direktori dan file

Fungsi yang disajikan di bawah menyediakan sarana untuk mengekstrak nama file dan properti lainnya dari satu direktori, atau menjelajahi subdirektori secara rekursif

PHP 5 memperkenalkan fungsi scandir yang akan "Mencantumkan file dan direktori di dalam jalur yang ditentukan" tetapi tidak akan muncul kembali atau memberikan informasi tambahan tentang file yang terdaftar

Jika Anda menggunakan PHP 5 atau lebih tinggi, lihat artikel baru kami tentang Daftar Direktori menggunakan kelas SPL untuk pendekatan yang jauh lebih rapi, dan kelas FileList PHP baru kami

Daftar Direktori Tunggal

Untuk memulai, berikut adalah fungsi sederhana yang mengembalikan daftar file, direktori, dan propertinya dari satu direktori (versi lebih lanjut dari fungsi ini dapat ditemukan lebih jauh di bawah halaman)

// array to hold return value $retval = []; // add trailing slash if missing if(substr($dir, -1) != "/") { $dir .= "/"; } // open pointer to directory and read list of files $d = @dir($dir) or die("getFileList: Failed opening directory {$dir} for reading"); while(FALSE !== ($entry = $d->read())) { // skip hidden files if($entry{0} == ".") continue; if(is_dir("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}/", 'type' => filetype("{$dir}{$entry}"), 'size' => 0, 'lastmod' => filemtime("{$dir}{$entry}") ]; } elseif(is_readable("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}", 'type' => mime_content_type("{$dir}{$entry}"), 'size' => filesize("{$dir}{$entry}"), 'lastmod' => filemtime("{$dir}{$entry}") ]; } } $d->close(); return $retval; } ?>

Anda dapat menggunakan fungsi ini sebagai berikut

// list files in the current directory $dirlist = getFileList("."); $dirlist = getFileList("./"); // a subdirectory of the current directory called images $dirlist = getFileList("images"); $dirlist = getFileList("images/"); $dirlist = getFileList("./images"); $dirlist = getFileList("./images/"); // using an absolute path $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images"); $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images/"); ?>_

Variabel $_SERVER['DOCUMENT_ROOT'] harus diselesaikan ke direktori root situs web Anda. e. g. /var/www/public_html

Nilai yang dikembalikan adalah larik asosiatif file termasuk jalur file, jenis, ukuran, dan tanggal modifikasi terakhir, kecuali jika file sebenarnya adalah direktori, dalam hal ini string "(dir)" akan muncul alih-alih ukuran file. Nama file mengambil batang yang sama dengan pemanggilan fungsi

Contoh 1

",print_r($dirlist),""; /* sample output Array ( [0] => Array ( [name] => images/background0.jpg [type] => image/jpeg [size] => 86920 [lastmod] => 1077461701 ) [1] => .. ) */ ?>

Contoh 2

",print_r($dirlist),""; /* sample output Array ( [0] => Array ( [name] => ./images/background0.jpg [type] => image/jpeg [size] => 86920 [lastmod] => 1077461701 ) [1] => .. ) */ ?>

Jika Anda ingin output diurutkan berdasarkan satu atau beberapa bidang, Anda harus membaca artikel tentang Menyortir Array dari Array atau mencoba salah satu Algoritma Penyortiran DHTML kami menggunakan JavaScript

Kami juga memiliki artikel tentang Daftar Direktori menggunakan kelas SPL (DirectoryIterator dan SplFileInfo) yang memperkenalkan banyak opsi baru untuk memfilter dan menyortir keluaran

Menampilkan Daftar File dalam HTML

Untuk menampilkan hasil ke halaman HTML, kami hanya mengulangi array yang dikembalikan

// output file list in HTML TABLE format echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; foreach($dirlist as $file) { echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; } echo "\n"; echo "NameTypeSizeLast Modified{$file['name']}{$file['type']}{$file['size']}",date('r', $file['lastmod']),"\n\n"; ?>_

Kode ini dapat dengan mudah dimodifikasi. jadikan output sebagai daftar, bukan tabel;

Tampilkan gambar PNG dalam TABEL

Misalnya, untuk hanya menampilkan file PNG, tambahkan saja kondisi ke loop keluaran

// output file list as HTML table echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; foreach($dirlist as $file) { if(!preg_match("/\.png$/", $file['name'])) { continue; } echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; } echo "\n"; echo "NameTypeSizeLast Modified{$file['name']}{$file['type']}{$file['size']}",date('r', $file['lastmod']),"\n\n"; ?>

Di sini Anda dapat melihat kode sumber lengkap untuk contoh ini

Ini akan memiliki efek melewatkan semua file yang namanya tidak diakhiri dengan. png. Anda juga dapat menerapkan ketentuan berdasarkan jenis file, ukuran, atau stempel waktu terakhir yang dimodifikasi

Buat daftar file PDF dengan tautan

Satu contoh terakhir, hanya mencantumkan file PDF dan menautkan nama file ke file tersebut

// output file list as table rows foreach($dirlist as $file) { if($file['type'] != 'application/pdf') { continue; } echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; } ?>NameTypeSizeLast Modified",basename($file['name']),"{$file['type']}{$file['size']}",date('r', $file['lastmod']),"_

Di sini Anda dapat melihat kode sumber lengkap untuk contoh ini

Jika Anda ingin menampilkan, misalnya, thumbnail sebagai tautan ke gambar yang lebih besar, atau bahkan video, berikan saja kedua file itu nama yang sama dan dalam skrip di atas gunakan str_replace atau fungsi serupa untuk memodifikasi tautan href atau . Lihat artikel kami tentang daftar gambar untuk contoh

Dengan menggunakan kelas SPL DirectoryIterator dan FilterIterator, kita sekarang dapat menentukan pola yang cocok saat mengakses daftar file sehingga hanya file yang cocok yang dikembalikan. Lebih lanjut tentang itu di sini

Daftar Direktori Rekursif

Sekarang kita sudah sampai sejauh ini, itu hanya perubahan kecil untuk memperluas fungsi untuk mendaftar subdirektori secara rekursif. Dengan menambahkan parameter kedua ke fungsi, kami juga mempertahankan fungsi sebelumnya untuk mendaftar satu direktori

// Original PHP code by Chirp Internet: www.chirpinternet.eu // Please acknowledge use of this code by including this header. function getFileList($dir, $recurse = FALSE) { $retval = []; // add trailing slash if missing if(substr($dir, -1) != "/") { $dir .= "/"; } // open pointer to directory and read list of files $d = @dir($dir) or die("getFileList: Failed opening directory {$dir} for reading"); while(FALSE !== ($entry = $d->read())) { // skip hidden files if($entry{0} == ".") continue; if(is_dir("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}/", 'type' => filetype("{$dir}{$entry}"), 'size' => 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[] = [ 'name' => "{$dir}{$entry}", 'type' => mime_content_type("{$dir}{$entry}"), 'size' => filesize("{$dir}{$entry}"), 'lastmod' => filemtime("{$dir}{$entry}") ]; } } $d->close(); return $retval; } ?>

Untuk memanfaatkan fungsionalitas baru, Anda harus memberikan nilai TRUE (atau 1) sebagai parameter kedua

// single directory $dirlist = getFileList("./"); // include subdirectories $dirlist = getFileList("./", TRUE); ?>_

Sebelum mengulang skrip terlebih dahulu periksa apakah sub-direktori dapat dibaca, dan jika tidak pindah ke item berikutnya untuk menghindari kesalahan izin

Seperti sebelumnya, nilai yang dikembalikan adalah larik dari larik asosiatif. Faktanya satu-satunya perubahan adalah Anda memiliki opsi tambahan untuk daftar rekursif

Rekursi Kedalaman Terbatas

Contoh terakhir ini menambahkan fitur lain - kemampuan untuk menentukan seberapa dalam rekursi yang Anda inginkan. Kode sebelumnya akan terus menjelajahi direktori hingga kehabisan tempat untuk dituju. Dengan skrip ini Anda dapat mengatakannya untuk tidak masuk lebih dalam dari jumlah level yang tetap dalam sistem file

// Original PHP code by Chirp Internet: www.chirpinternet.eu // Please acknowledge use of this code by including this header. function getFileList($dir, $recurse = FALSE, $depth = FALSE) { $retval = []; // add trailing slash if missing if(substr($dir, -1) != "/") { $dir .= "/"; } // open pointer to directory and read list of files $d = @dir($dir) or die("getFileList: Failed opening directory {$dir} for reading"); while(FALSE !== ($entry = $d->read())) { // skip hidden files if($entry{0} == ".") continue; if(is_dir("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}/", 'type' => filetype("{$dir}{$entry}"), 'size' => 0, 'lastmod' => filemtime("{$dir}{$entry}") ]; if($recurse && is_readable("{$dir}{$entry}/")) { if($depth === FALSE) { $retval = array_merge($retval, getFileList("{$dir}{$entry}/", TRUE)); } elseif($depth > 0) { $retval = array_merge($retval, getFileList("{$dir}{$entry}/", TRUE, $depth-1)); } } } elseif(is_readable("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}", 'type' => mime_content_type("{$dir}{$entry}"), 'size' => filesize("{$dir}{$entry}"), 'lastmod' => filemtime("{$dir}{$entry}") ]; } } $d->close(); return $retval; } ?>_

Seperti sebelumnya kita telah menambahkan satu parameter baru dan beberapa baris kode. Nilai default parameter kedalaman, jika tidak ditentukan dalam pemanggilan fungsi, disetel ke FALSE. Hal ini memastikan bahwa semua fitur sebelumnya tetap ada dan kode lama apa pun tidak akan rusak saat fungsinya diubah

Dengan kata lain, kita sekarang dapat memanggil fungsi getFileList dengan satu, dua atau tiga parameter

// list files in the current directory $dirlist = getFileList("."); $dirlist = getFileList("./"); // a subdirectory of the current directory called images $dirlist = getFileList("images"); $dirlist = getFileList("images/"); $dirlist = getFileList("./images"); $dirlist = getFileList("./images/"); // using an absolute path $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images"); $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images/"); ?>_0

Ini adalah contoh yang bagus tentang bagaimana suatu fungsi dapat berkembang dari waktu ke waktu tanpa menjadi tidak dapat dikelola. Terlalu sering Anda melihat fungsi yang dulu berguna menjadi tidak dapat digunakan karena parameter membengkak

Fileinfo menggantikan mime_content_type

Fungsi mime_content_type telah ditinggalkan dalam versi PHP terbaru dan diganti dengan ekstensi Fileinfo PECL tidak pernah benar-benar ditinggalkan, meskipun pengumuman sebaliknya

Jika Anda melihat kesalahan dalam program Anda karena ini, tambalan berikut akan berfungsi

// list files in the current directory $dirlist = getFileList("."); $dirlist = getFileList("./"); // a subdirectory of the current directory called images $dirlist = getFileList("images"); $dirlist = getFileList("images/"); $dirlist = getFileList("./images"); $dirlist = getFileList("./images/"); // using an absolute path $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images"); $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images/"); ?>_1

Ini adalah fungsi yang sama seperti yang terlihat di bagian atas halaman, hanya dengan mencentang fungsi mime_content_type yang disisipkan di bagian atas untuk menentukan metode mana yang kita gunakan untuk mendapatkan tipe file

Jika Anda memindai sistem direktori yang kompleks, Anda mungkin ingin mendeklarasikan $finfo sebagai variabel global untuk menghindari keharusan membuat ulang ketika fungsi berulang

Bagaimana cara mendapatkan daftar file dari direktori di PHP?

PHP menggunakan scandir() untuk menemukan folder dalam direktori . Ini mencantumkan file dan direktori yang ada di dalam jalur yang ditentukan oleh pengguna. The scandir function is an inbuilt function that returns an array of files and directories of a specific directory. It lists the files and directories present inside the path specified by the user.

Bagaimana cara mendapatkan daftar file dalam direktori?

Untuk membuat daftar semua file di direktori saat ini, ketik berikut ini. ls -a Ini mencantumkan semua file, termasuk. dot (. ).
Untuk menampilkan informasi detail, ketik berikut ini. ls -l bab 1. Profil. .
Untuk menampilkan informasi rinci tentang direktori, ketik berikut ini. ls -d -l

Apa itu __ dir __ PHP?

__DIR__ dapat digunakan untuk mendapatkan direktori kerja kode saat ini . Itu telah diperkenalkan di PHP mulai dari versi 5. 3. Ini mirip dengan menggunakan dirname(__FILE__). Biasanya digunakan untuk menyertakan file lain yang ada dalam file yang disertakan.

Bagaimana cara mendapatkan jalur file di PHP?

Untuk mendapatkan jalur file yang tepat, Anda dapat menggunakan realpath() . Di antara tanda kurung fungsi, ketikkan nama file. $dir = dirname("folder/myphp/fileDir.