Sunday, June 21, 2015

Get all files hoăc thư mục trong thư mục khác bằng PHP

9:08 AM

Đã bao giờ bạn gặp phải vấn đề cần lấy tất cả file trong thư mục khác hoặc thư mục trong thư mục khác hay chưa. Trong bài viết này mình sẽ cùng bạn đi tìm hiểu cách list all file and folder trong php






Trong php có các hàm có sẵn giúp chúng ta có thể liệt kê toàn bộ file hoặc thư mục trong thư mục khác như scandir , readdir hoặc glob. Trong bài này mình sẽ hướng dẫn các bạn sử dụng hàm glob vì nó đơn giản và nó cung cấp cho chúng ta một đường dẫn đầy đủ. Còn hàm scandir sẽ chỉ cung cấp tên thư mục hoặc tên file trong thư mục đó. Vd ta có thư mục mydir chứa các file: freetuthay.html,demo.php và thư mục: images,javascript. Nếu sử dụng hàm glob ta sẽ được kết quả như sau:

Array ( 
[0] => mydir/freetuthay.html,
[1] => mydir/demo.php
[2] => mydir/images
[3] => mydir/javascript
)
Còn nếu sử dụng hàm scandir sẽ được kết quả như thế này:

Array ( 
[0] => .
[1] => ..
[2] => freetuthay.html,
[3] => demo.php
[4] => images
[5] => javascript
)
Còn với hàm readdir thì nó phải sử dụng đến function opendir và các vòng lặp while điều đó là khá phức tạp và không cần thiết.

Để liệt kê danh sách file và thư mục trong thư mục mydir ta chỉ cần khởi tạo hàm với câu lệnh đơn giản sau
glob('mydir/*'); 

Trong điều kiện thư mục mydir nằm cùng thư mục chứa với file đang chạy. Có nghĩa là nếu bạn chạy code trong file index.php nằm trong thư mục www/test_code thì thư mục mydir cũng phải nằm trong thư mục test_code. Nếu như thư mục mydir ở bên ngoài thư mục test_code có nghĩa là www/mydir thì bạn thêm dấu .. vào trước. Dấu .. có nghĩa là ra ngoài thư mục 1 bậc lúc này code sẽ là glob('../mydir/*');
Ok, giờ mình sẽ gán biến cho nó:

$files_and_folder = glob('mydir/*');
print_r($files_and_folder); //Hàm debug array (mảng)

Chạy phát xem nào. Hô hô kết quả là như này đây 

Array ( 
[0] => mydir/freetuthay.html,
[1] => mydir/demo.php
[2] => mydir/images
[3] => mydir/javascript
)

Ngon rồi giờ bắt đầu lọc theo chỉ lấy thư mục hoặc chỉ lấy file thôi nhé

Chỉ lấy thư mục:
Ở đây chúng ta sẽ gắn flag GLOB_ONLYDIR cho hàm glob. Hiểu nôm na là phát đi một tín hiệu cho function glob và bảo nó là "Mày chỉ được lấy mỗi thư mục thôi đấy nhé". 
Ok, let code:

$folder = glob('mydir/*','GLOB_ONLYDIR');
print_r($folder);

Chạy phát nào
Return: 

Array ( 
[0] => mydir/images
[1] => mydir/javascript
)

Oh yeah, dễ quá phải không ^^

Chỉ get file

Thật là đắng lòng khi php không cung cấp một cái tín hiệu nào (flag) chỉ lấy mỗi file cho function glob. Nhưng không sao chuyện gì cũng có cách giải quyết của nó. Ở đây chúng ta sẽ dùng hàm array_filter vì thằng glob trả về cho ta một mảng nên ta sẽ dùng cái này để lọc mảng.
Code nào:
$files = array_filter(glob('mydir/*'),'is_file');
print_r($files);
Return: 
Array ( 
[0] => mydir/freetuthay.html,
[1] => mydir/demo.php
)
Hay chưa hehe
Giờ ta cùng nhau nâng cao hơn tẹo nữa nhé, ta sẽ thêm vài cái filter cho nó ác
Code:
array_filter(glob('mydir/*'),function($file) {
 return (is_file($file) && filesize($file)<30000);
});

Cái này có nghĩa là chỉ lấy những file ở trong thư mục mydir và các file đó nhỏ hơn 30000/1024 kb ^^. Với cách này bạn có thể lọc nhiều hơn như lọc theo tên lọc theo đuôi file với hàm preg_match,... etc 

Chúc bạn sẽ thành công và hy vọng bài viết sẽ hữu ích với bạn!!


 

Written by

Tôi là Quý, năm nay 18 tuổi với đam mê lập trình không giới hạn, tôi đã tự mình tìm hiểu mà không hề có thầy cô hoặc học ở bất cứ trường lớp trung tâm nào. Và tôi đã làm được những điều mà chính tôi cũng không thể tin được. Với hy vọng sẽ đem thêm nhiều tut hay đến cho mọi người nên đã lập ra blog này. Mong mọi người sẽ ủng hộ ^^!

0 comments:

Post a Comment

 

© 2015 Chia sẻ tất cả các tutorial hay nhất về lập trình. All rights resevered. Designed by Templateism Chia sẻ những điều tốt nhất về lập trình

Back To Top