2011-12-16 33 views
28

Tôi đang sử dụng đoạn mã sau để có được một danh sách các hình ảnh trong một thư mục:Loại trừ các tập tin ẩn từ scandir

$files = scandir($imagepath); 

nhưng $files cũng bao gồm các tập tin ẩn. Làm thế nào tôi có thể loại trừ chúng?

+0

Những câu trả lời ở đây là về Linux hosting. Đối với tất cả những người muốn đọc về lưu trữ Windows, hãy xem tại đây: [http://stackoverflow.com/questions/30290663/does-php-scandir-exclude-hidden-files-under-windows](http://stackoverflow. com/questions/30290663/does-php-scandir-exclude-hidden-files-under-windows) –

Trả lời

50

Trên Unix, bạn có thể sử dụng preg_grep để lọc ra các tên tập tin bắt đầu bằng một dấu chấm:

$files = preg_grep('/^([^.])/', scandir($imagepath)); 
+1

Điều này cũng hoạt động trong Windows quá – Remo

0

Giả sử các tập tin ẩn bắt đầu với một . bạn có thể làm một cái gì đó như thế này khi xuất ra:

foreach($files as $file) { 
    if(strpos($file, '.') !== (int) 0) { 
     echo $file; 
    } 
} 

Bây giờ bạn kiểm tra tất cả các mục nếu không có . như ký tự đầu tiên, và nếu không nó Echos bạn như bạn sẽ làm.

+2

Sử dụng 'strpos' để kiểm tra xem ký tự đầu tiên của tên tệp có phải là dấu chấm không phức tạp không cần thiết - và không hiệu quả, vì nó tìm kiếm toàn bộ chuỗi khi bạn chỉ quan tâm đến một ký tự. Ngoài ra, nó không có ý nghĩa gì cả khi bỏ chữ '0' thành' int'; nó đã là một. Chỉ cần thay 'if ($ file [0]! = '.') {...}'. –

5

tôi có xu hướng sử dụng DirectoryIterator cho những thứ như thế này mà cung cấp một phương pháp đơn giản để bỏ qua dot file:

$path = '/your/path'; 
foreach (new DirectoryIterator($path) as $fileInfo) { 
    if($fileInfo->isDot()) continue; 
    $file = $path.$fileInfo->getFilename(); 
} 
+14

Chỉ cần làm rõ, 'isDot()' không bỏ qua các tệp bắt đầu bằng '.'. Chỉ cần thử trên hệ thống của tôi PHP 5.3.5. – resting

+2

Câu trả lời này là sai. "Dấu chấm tệp" hoặc "tệp ẩn" trên Unix là * mọi tệp * có tên bắt đầu bằng dấu chấm. Nhưng, theo [tài liệu] (http://php.net/manual/en/directoryiterator.isdot.php), 'isDot' chỉ khớp nếu tệp là' .' hoặc '..'. Một thử nghiệm nhanh chóng xác nhận rằng nó sẽ không phù hợp với hầu hết các tập tin dấu chấm. –

-1

Tôi vẫn để lại dấu kiểm cho giải pháp của Seengee và tôi đã đăng một bình luận dưới đây cho một sự điều chỉnh nhỏ cho giải pháp của mình. (. Và ..)

mặt nạ Giải pháp của ông các thư mục nhưng không che giấu các tập tin ẩn như .htaccess

Một tinh chỉnh nhỏ giải quyết vấn đề:

foreach(new DirectoryIterator($curDir) as $fileInfo) { 
    //Check for something like .htaccess in addition to . and .. 
    $fileName = $fileInfo->getFileName(); 
    if(strlen(strstr($fileName, '.', true)) < 1) continue; 

    echo "<h3>" . $fileName . "</h3>"; 
} 
+2

Đây là cách kiểm tra quá phức tạp để kiểm tra xem '$ fileName' có bắt đầu bằng dấu chấm hay không; Tôi đã phải nghiên cứu trang người đàn ông ['strstr'] (http://php.net/strstr) để hiểu được những gì bạn đang làm ở đây. Nó cũng * bị hỏng *; điều này lọc ra không chỉ tên tập tin bắt đầu bằng dấu chấm, mà còn cả tên tập tin không có dấu chấm trong chúng (vì trong trường hợp đó 'strstr' trả về' FALSE' và 'strlen (FALSE)' trả về 0, nhỏ hơn 1 Hoàn toàn không cần đến sự phức tạp này, chỉ cần 'if ($ fileName [0] == '.') Tiếp tục'. –

3
function nothidden($path) { 
    $files = scandir($path); 
    foreach($files as $file) { 
     if ($file[0] != '.') $nothidden[] = $file; 
     return $nothidden; 
    } 
} 

Đơn giản chỉ cần sử dụng chức năng này

$files = nothidden($imagepath); 
+0

Nếu bạn không muốn sử dụng' preg_grep' vì regexes làm bạn sợ, * this * là con đường để đi - kiểm tra xem tên tập tin có bắt đầu bằng dấu chấm hay không bằng cách * nhận ký tự đầu tiên và kiểm tra xem đó có phải là dấu chấm * không phải là khoa học tên lửa, nhưng nó không cần phải là. bởi một số câu trả lời khác ở đây, ngoài việc không hiệu quả hay sai, không cần thiết phức tạp hơn cách tiếp cận này. –

0

Tôi gặp phải một nhận xét từ php.net, đặc biệt cho các hệ thống Windows: http://php.net/manual/en/function.filetype.php#87161

Trích dẫn ở đây cho mục đích lưu trữ:

tôi sử dụng phiên bản CLI của PHP trên Windows Vista. Dưới đây là làm thế nào để xác định xem một tập tin được đánh dấu "ẩn" của NTFS:

function is_hidden_file($fn) { 

    $attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA')); 

    if($attr[3] === 'h') 
     return true; 

    return false; 
} 

Thay đổi if($attr[3] === 'h') để if($attr[4] === 's') sẽ kiểm tra tập tin hệ thống.

Điều này sẽ hoạt động trên bất kỳ hệ điều hành Windows nào cung cấp các lệnh shell của DOS.

1

Tôi nghĩ bởi vì bạn đang cố gắng để 'lọc' ra các tập tin ẩn, nó có ý nghĩa hơn và trông tốt nhất để làm điều này ...

$items = array_filter(scandir($directory), function ($item) { 
    return 0 !== strpos($item, '.'); 
}); 

Tôi cũng không gọi biến $files vì nó ngụ ý rằng nó chỉ chứa các tệp, nhưng thực tế bạn cũng có thể nhận các thư mục ... trong một số trường hợp :)

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