Làm cách nào để lấy tất cả các thư mục trong PHP?

Yêu cầu phổ biến là có thể tạo danh sách một số hoặc tất cả các tệp trong một thư mục - tương tự như trang chỉ mục mặc định được cung cấp bởi hầu hết các máy chủ web, nhưng có nhiều quyền kiểm soát hơn đối với nội dung và định dạng

Một mục tiêu khác có thể là thực hiện một số hành động trên các tệp bằng PHP. Trong cả hai trường hợp, bước đầu tiên là truy vấn hệ thống tệp để trả về danh sách các thư mục và tệp

Các hàm được trình bày bên dưới cung cấp phương tiện để trích xuất tên tệp và các thuộc tính khác từ một thư mục hoặc để khám phá các thư mục con theo cách đệ quy

PHP 5 giới thiệu chức năng scandir sẽ "Liệt kê các tệp và thư mục bên trong đường dẫn đã chỉ định" nhưng sẽ không lặp lại hoặc cung cấp thông tin bổ sung về các tệp được liệt kê

Nếu bạn đang sử dụng PHP 5 trở lên, hãy xem bài viết mới của chúng tôi về Danh sách thư mục bằng cách sử dụng các lớp SPL để có cách tiếp cận gọn gàng hơn nhiều và lớp FileList PHP mới của chúng tôi

Danh sách thư mục đơn

Để bắt đầu, đây là một hàm đơn giản trả về danh sách các tệp, thư mục và thuộc tính của chúng từ một thư mục duy nhất (bạn có thể tìm thấy các phiên bản nâng cao hơn của hàm này ở cuối trang)

// 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; } ?>

Bạn có thể sử dụng chức năng này như sau

// 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/"); ?>

Biến $_SERVER['DOCUMENT_ROOT'] sẽ phân giải thành thư mục gốc của trang web của bạn. e. g. /var/www/public_html

Giá trị trả về là một mảng tệp kết hợp bao gồm đường dẫn tệp, loại, kích thước và ngày sửa đổi lần cuối, ngoại trừ khi tệp thực sự là một thư mục, trong trường hợp đó, chuỗi "(dir)" xuất hiện thay vì kích thước tệp. Tên tệp có cùng gốc với lệnh gọi hàm

ví dụ 1

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

ví dụ 2

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

Nếu bạn muốn đầu ra được sắp xếp theo một hoặc nhiều trường, bạn nên đọc bài viết về Sắp xếp Mảng của Mảng hoặc thử một trong các Thuật toán Sắp xếp DHTML của chúng tôi bằng JavaScript

Chúng tôi cũng có một bài viết về Danh sách thư mục sử dụng các lớp SPL (DirectoryIterator và SplFileInfo) giới thiệu nhiều tùy chọn mới để lọc và sắp xếp đầu ra

Hiển thị danh sách tệp trong HTML

Để xuất kết quả ra trang HTML, chúng ta chỉ cần lặp qua mảng được trả về

// 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"; ?>

Mã này có thể dễ dàng sửa đổi thành. biến đầu ra thành một danh sách thay vì một bảng;

Hiển thị hình ảnh PNG trong BẢNG

Ví dụ: để chỉ hiển thị các tệp PNG, chỉ cần thêm một điều kiện vào vòng lặp đầu ra

// 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"; ?>

Tại đây bạn có thể xem mã nguồn hoàn chỉnh cho ví dụ này

Điều này sẽ có tác dụng bỏ qua tất cả các tệp có tên không kết thúc bằng. png. Bạn cũng có thể áp dụng các điều kiện dựa trên loại tệp, kích thước hoặc dấu thời gian sửa đổi lần cuối

Liệt kê các tệp PDF có liên kết

Một ví dụ cuối cùng, chỉ liệt kê các tệp PDF và có tên tệp liên kết tới tệp

// 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']),"

Tại đây bạn có thể xem mã nguồn hoàn chỉnh cho ví dụ này

Ví dụ: nếu bạn muốn hiển thị hình thu nhỏ dưới dạng liên kết đến hình ảnh lớn hơn hoặc thậm chí là video, chỉ cần đặt tên giống nhau cho hai tệp và trong đoạn mã trên, hãy sử dụng hàm str_replace hoặc chức năng tương tự để sửa đổi liên kết href hoặc . Xem bài viết của chúng tôi về danh sách hình ảnh để biết ví dụ

Sử dụng các lớp SPL DirectoryIterator và FilterIterator giờ đây chúng ta có thể chỉ định một mẫu phù hợp khi truy cập danh sách tệp để chỉ các tệp phù hợp được trả về. Thêm về điều đó ở đây

Danh sách thư mục đệ quy

Bây giờ chúng ta đã đi xa đến mức này, đây chỉ là một thay đổi nhỏ để mở rộng chức năng nhằm liệt kê đệ quy bất kỳ thư mục con nào. Bằng cách thêm tham số thứ hai vào chức năng, chúng tôi cũng giữ lại chức năng trước đó là liệt kê một thư mục

// 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; } ?>

Để sử dụng chức năng mới, bạn cần chuyển giá trị TRUE (hoặc 1) làm tham số thứ hai

________số 8_______

Trước khi lặp lại tập lệnh, trước tiên hãy kiểm tra xem các thư mục con có thể đọc được hay không và chuyển sang mục tiếp theo để tránh các lỗi về quyền

Như trước đây, giá trị trả về là một mảng các mảng kết hợp. Trên thực tế, thay đổi duy nhất là bạn có thêm tùy chọn danh sách đệ quy

Đệ quy độ sâu giới hạn

Ví dụ cuối cùng này thêm một tính năng khác - khả năng chỉ định mức độ sâu mà bạn muốn đệ quy đi. Mã trước đó sẽ tiếp tục khám phá các thư mục cho đến khi hết chỗ để đi. Với tập lệnh này, bạn có thể yêu cầu tập lệnh không đi sâu hơn một số mức cố định trong hệ thống tệp

// 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; } ?>

Như trước đây, chúng tôi đã thêm một tham số mới và một vài dòng mã. Giá trị mặc định của tham số độ sâu, nếu không được xác định trong lệnh gọi hàm, được đặt thành FALSE. Điều này đảm bảo rằng tất cả các tính năng trước đó vẫn còn và bất kỳ mã cũ nào sẽ không bị hỏng khi thay đổi chức năng

Nói cách khác, bây giờ chúng ta có thể gọi hàm getFileList với một, hai hoặc ba tham số

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

Đây là một ví dụ điển hình về cách một chức năng có thể phát triển theo thời gian mà không trở nên không thể quản lý được. Bạn thường xuyên thấy các chức năng từng hữu ích trở nên không sử dụng được do phình to tham số

Fileinfo thay thế mime_content_type

Hàm mime_content_type không được dùng trong phiên bản PHP gần đây và được thay thế bằng phần mở rộng PECL Fileinfo chưa bao giờ thực sự bị phản đối, mặc dù có thông báo ngược lại

Nếu bạn thấy lỗi trong chương trình của mình do điều này, bản vá sau sẽ hoạt động

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

Đây là chức năng tương tự như đã thấy ở đầu trang, chỉ cần kiểm tra chức năng mime_content_type được chèn ở trên cùng để xác định phương pháp chúng tôi sử dụng để lấy loại tệp

Nếu bạn đang quét một hệ thống thư mục phức tạp, bạn có thể muốn khai báo $finfo như một biến toàn cục để tránh phải khởi tạo lại nó khi hàm lặp lại

Làm thế nào tôi có thể nhận được một danh sách các thư mục?

Mở File Explorer trong Windows. .
Nhấp vào thanh địa chỉ và thay thế đường dẫn tệp bằng cách nhập cmd rồi nhấn Enter
Điều này sẽ mở một dấu nhắc lệnh đen trắng hiển thị đường dẫn tệp ở trên
Nhập thư mục /A. D. .
Bây giờ sẽ có một tệp văn bản mới có tên là FolderList trong thư mục trên

__ thư mục __ PHP là gì?

Có thể sử dụng __DIR__ để lấy thư mục làm việc của mã hiện tại . Nó đã được giới thiệu trong PHP bắt đầu từ phiên bản 5. 3. Nó tương tự như sử dụng dirname(__FILE__). Thông thường, nó được sử dụng để bao gồm các tệp khác có trong một tệp được bao gồm.

Làm cách nào để hiển thị cây thư mục trong PHP?

Tập lệnh cấu trúc thư mục cây với PHP .
mảng();
scandir();
is_dir();
thông tin đường dẫn();
in_array();

Làm cách nào để kiểm tra xem thư mục có tồn tại trong PHP không?

Hàm PHP is_dir() . Ghi chú. Kết quả của chức năng này được lưu trữ. Sử dụng clearstatcache() để xóa cache.