2012-12-29 36 views
24

Tôi biết rằng glob có thể tìm kiếm tất cả các file hoặc thư mục chỉ tất cả các bên trong một thư mục:Có cách nào để glob() chỉ các tập tin?

echo "All files:\n"; 
$all = glob("/*"); 
var_dump($all); 

echo "Only directories\n"; 
$dirs = glob("/*", GLOB_ONLYDIR); 
var_dump($dirs); 

Nhưng tôi đã không tìm thấy một cái gì đó để tìm các tập tin chỉ trong một dòng duy nhất có hiệu quả.

$files = array_diff(glob("/*"), glob("/*", GLOB_ONLYDIR)); 

Hoạt động tốt nhưng đọc thư mục hai lần (ngay cả khi có some optimizations giúp duyệt web lần hai nhanh hơn).

+1

bạn có thể 'glob (" *. * ")' Điều này không hoạt động mặc dù thư mục chứa '.' trong đó hoặc tệp không có phần mở rộng. –

Trả lời

44

cuối cùng tôi đã tìm thấy một giải pháp:

echo "Only files\n"; 
$files = array_filter(glob("/*"), 'is_file'); 
var_dump($files); 

Nhưng chăm sóc, array_filter mà vẫn duy trì phím số: sử dụng array_values nếu bạn cần phải reindex mảng.

+0

Đẹp! Sử dụng vòng lặp foreach sẽ giải quyết vấn đề của các phím số được bảo tồn từ array_filter. – Imdad

-10
$all = glob("/*.*"); 

điều này sẽ liệt kê mọi thứ bằng dấu "." sau tên tệp. về cơ bản, tất cả các tệp.

+14

Vì khi nào các tệp cần có phần mở rộng? Và điều gì khiến bạn nghĩ rằng một thư mục không thể có một dấu chấm trong tên của nó? –

5

Bạn có thể sử dụng GLOB_BRACE để phù hợp với các tài liệu chống lại một danh sách các phần mở rộng tập tin được biết:

$files = glob("/path/to/directory/*.{jpg,gif,png,html,htm,php,ini}", GLOB_BRACE); 

see: http://www.electrictoolbox.com/php-glob-find-files/

+6

Sẽ hoạt động trong hầu hết các trường hợp, nhưng hãy cẩn thận vì các thư mục cũng có thể được đặt tên là 'toto.jpg' nếu bạn muốn. –

3

Có một cách dễ dàng hơn, chỉ cần một dòng:

$files = glob("/path/to/directory/*.{*}", GLOB_BRACE); 

{*} có nghĩa là tất cả các đuôi tệp, vì vậy mọi tệp, nhưng không có thư mục!

+2

Không, '{}' thay thế bất kỳ ký tự nào trên các tệp hoặc thư mục mà không phân biệt. –

1

giải pháp khác:

$files = glob('../{,.}*', GLOB_BRACE); 
foreach ($files as $i => $file) { 
    if (is_dir($file)) { 
     unset($files[$i]); 
    } 
} 

Hoặc:

$files = glob('../{,.}*', GLOB_BRACE | GLOB_MARK); 
foreach ($files as $i => $file) { 
    if ($file[ strlen($file) - 1 ] == '/') { 
     unset($files[$i]); 
    } 
} 

Cả gìn giữ phím số, do đó bạn có thể muốn re-index.

P.S. Bạn cũng phải sử dụng {,.}*', GLOB_BRACE nếu bạn muốn get hidden files.

Các vấn đề liên quan