Thư mục trong PHP
Trong hướng dẫn này, bạn sẽ học cách xử lý cây thư mục hoặc thư mục bằng PHP.
Làm việc với các thư mục trong PHP
Trong chương trước, bạn đã học cách làm việc với các tệp trong PHP. Tương tự, PHP cũng cho phép bạn làm việc với các thư mục trên hệ thống tệp, ví dụ, bạn có thể mở một thư mục và đọc nội dung của nó, tạo hoặc xóa một thư mục, liệt kê tất cả các tệp trong thư mục, v.v.
Tạo một thư mục mới
Bạn có thể tạo một thư mục mới và trống bằng cách gọi hàm mkdir()
với đường dẫn và tên của thư mục sẽ được tạo, như thể hiện trong ví dụ dưới đây:
Ví dụ
<?php
// Đường dẫn thư mục
$dir = "testdir";
// Kiểm tra sự tồn tại của thư mục
if(!file_exists($dir)){
// Tạo thư mục
if(mkdir($dir)){
echo "Đã tạo thư mục thành công.";
} else{
echo "LỖI: Không thể tạo thư mục.";
}
} else{
echo "LỖI: Thư mục đã tồn tại.";
}
?>
Để cho hàm mkdir()
hoạt động, các thư mục cha trong tham số đường dẫn thư mục phải tồn tại, ví dụ: nếu bạn chỉ định đường dẫn thư mục testdir/subdir thì buộc thư mục testdir phải tồn tại, nếu không PHP sẽ tạo ra lỗi.
Sao chép tệp từ vị trí này sang vị trí khác
Bạn có thể sao chép tệp từ vị trí này sang vị trí khác bằng cách gọi hàm copy()
với các đường dẫn nguồn và đích của tệp làm đối số. Nếu tệp đích đã tồn tại, nó sẽ bị ghi đè. Đây là một ví dụ tạo bản sao của tệp "example.txt" bên trong thư mục sao lưu.
Ví dụ
<?php
// Đường dẫn tệp nguồn
$file = "example.txt";
// Đường dẫn tệp đích
$newfile = "backup/example.txt";
// Kiểm tra sự tồn tại của tệp
if(file_exists($file)){
// Sao chép tệp
if(copy($file, $newfile)){
echo "Sao chép thành công.";
} else{
echo "LỖI: Không thể sao chép tệp.";
}
} else{
echo "LỖI: Tệp không tồn tại.";
}
?>
Để làm cho ví dụ này hoạt động, thư mục đích được sao lưu và tệp nguồn tức là "example.txt" phải tồn tại; nếu không PHP sẽ tạo ra lỗi.
Liệt kê tất cả các tệp trong một thư mục
Bạn có thể sử dụng hàm scandir()
để liệt kê các tệp và thư mục bên trong đường dẫn được chỉ định.
Bây giờ chúng ta sẽ tạo một hàm tùy chỉnh sẽ liệt kê đệ quy tất cả các tệp trong một thư mục bằng PHP. Tập lệnh này sẽ hữu ích nếu bạn đang làm việc với cấu trúc thư mục lồng nhau sâu.
Ví dụ
<?php
// Định nghĩa một hàm để xuất tệp trong một thư mục
function outputFiles($path){
// Kiểm tra xem thư mục tồn tại hay không
if(file_exists($path) && is_dir($path)){
// Quét tệp tin trong thư mục
$result = scandir($path);
// Lọc ra các thư mục hiện tại (.) Và cha (..)
$files = array_diff($result, array('.', '..'));
if(count($files) > 0){
// Lặp qua mảng được trả về
foreach($files as $file){
if(is_file("$path/$file")){
// Hiện tên tệp tin
echo $file . "<br>";
} else if(is_dir("$path/$file")){
// Gọi lại hàm đệ quy nếu tìm thấy các thư mục
outputFiles("$path/$file");
}
}
} else{
echo "LỖI: Không có tệp tin nào trong thư mục.";
}
} else {
echo "LỖI: Thư mục không tồn tại";
}
}
// Gọi hàm
outputFiles("mydir");
?>
Liệt kê tất cả các tệp thuộc một loại nhất định
Trong khi làm việc trên cấu trúc thư mục và tệp, đôi khi bạn có thể cần phải tìm ra một số loại tệp nhất định trong thư mục, ví dụ: chỉ liệt kê tệp .txt hoặc .png, v.v. Bạn có thể thực hiện điều này dễ dàng với hàm glob()
, hàm này khớp các tệp dựa trên mẫu .
Mã PHP trong ví dụ sau sẽ tìm kiếm thư mục tài liệu và liệt kê tất cả các tệp có phần mở rộng .txt. Nó sẽ không tìm kiếm các thư mục con.
Ví dụ
<?php
/* Tìm kiếm thư mục và lặp qua mảng trả về chứa các tệp phù hợp */
foreach(glob("documents/*.txt") as $file){
echo basename($file) . " (size: " . filesize($file) . " bytes)" . "<br>";
}
?>
Hàm glob()
cũng có thể được sử dụng để tìm tất cả các file trong một thư mục hoặc thư mục con của nó. Hàm được định nghĩa trong ví dụ sau sẽ liệt kê đệ quy tất cả các tệp trong một thư mục, giống như chúng ta đã làm trong ví dụ trước với hàm scandir()
.
Ví dụ
<?php
// Định nghĩa hàm tìm và xuất tệp tin
function outputFiles($path){
// Kiểm tra sự tồn tại của thư mục
if(file_exists($path) && is_dir($path)){
// Tìm kiếm tệp tin trong thư mục
$files = glob($path ."/*");
if(count($files) > 0){
// Lặp qua mảng được trả về
foreach($files as $file){
if(is_file("$file")){
// Hiện tên
echo basename($file) . "<br>";
} else if(is_dir("$file")){
// Gọi lại hàm đệ quy với thư mục tìm thấy
outputFiles("$file");
}
}
} else{
echo "LỖI: Không tìm thấy tệp tin nào trong thư mục.";
}
} else {
echo "LỖI: Thư mục không tồn tại.";
}
}
// Gọi hàm
outputFiles("mydir");
?>