Lấy tên của tất cả các tệp trong một thư mục bằng PHP


87

Vì một số lý do, tôi tiếp tục nhận được '1' cho các tên tệp có mã này:

if (is_dir($log_directory))
{
    if ($handle = opendir($log_directory))
    {
        while($file = readdir($handle) !== FALSE)
        {
            $results_array[] = $file;
        }
        closedir($handle);
    }
}

Khi tôi lặp lại từng phần tử trong $ results_array, tôi nhận được một loạt '1, không phải tên của tệp. Làm cách nào để lấy tên của tệp?


1
Có một số tùy chọn sử dụng cầu .
allnightgrocery


1
Vấn đề mà người đăng bài gặp phải là phép gán có mức ưu tiên rất thấp, vì vậy toán tử '! ==' được đánh giá đầu tiên và kết quả nhị phân của phép toán đó sau đó được gán cho tệp $. Cách khắc phục duy nhất cần thiết là sử dụng ($ file = readdir ($ handle))! == FALSE "
Omn


từ 69 phiếu bầu đến 70. Tôi cảm thấy giống như đối lập với Hank Moody
Charlie

Câu trả lời:


167

Đừng bận tâm với open / readdir và globthay vào đó hãy sử dụng :

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}

24
Bạn có thể muốn bao array_filter(..., 'is_file')quanh khối cầu đó vì câu hỏi yêu cầu tệp.
chào

23
Không phải tất cả các tên tệp đều có dạng *.*: chỉ cần sử dụng *thay thế.
jameshfisher

Làm thế nào chúng tôi có thể lấy tất cả các tệp trong danh sách các phần mở rộng? Ví dụ: nếu chúng ta muốn tất cả các tệp .php và .js?
Nis

3
Vâng, câu trả lời này không mạnh mẽ lắm. Các tệp không cần phải có phần mở rộng và có thể đặt tên cho các thư mục something.something. Tốt hơn là sử dụng array_filterglob($log_directory.'/*').
Andrew

Tôi đã ủng hộ điều này vì tôi chỉ cần câu trả lời đơn giản và tất cả các tệp liên quan cho trường hợp sử dụng của tôi sẽ được *.*. Một biểu thức mạnh mẽ hơn sẽ làm cho câu trả lời này thậm chí còn tốt hơn.
TecBrat

49

Kiểu SPL :

foreach (new DirectoryIterator(__DIR__) as $file) {
  if ($file->isFile()) {
      print $file->getFilename() . "\n";
  }
}

Kiểm tra các lớp DirectoryIteratorSplFileInfo để biết danh sách các phương thức khả dụng mà bạn có thể sử dụng.


Cách tuyệt vời để chỉ lấy tệp và chỉ tên của chúng thay vì toàn bộ đường dẫn, cảm ơn!
Chris

1
Đúng. Đối với các đường dẫn đầy đủ, bạn có thể sử dụng getPathname: php.net/manual/en/splfileinfo.getpathname.php
Ilija

18

Bạn cần phải bao quanh $file = readdir($handle)bằng dấu ngoặc đơn.

Của bạn đây:

$log_directory = 'your_dir_name_here';

$results_array = array();

if (is_dir($log_directory))
{
        if ($handle = opendir($log_directory))
        {
                //Notice the parentheses I added:
                while(($file = readdir($handle)) !== FALSE)
                {
                        $results_array[] = $file;
                }
                closedir($handle);
        }
}

//Output findings
foreach($results_array as $value)
{
    echo $value . '<br />';
}


14

Vì câu trả lời được chấp nhận có hai điểm thiếu sót quan trọng, tôi đăng câu trả lời được cải thiện cho những người mới tìm kiếm câu trả lời chính xác:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Việc lọc globekết quả của hàm với is_filelà cần thiết, vì nó cũng có thể trả về một số thư mục.
  2. Không phải tất cả các tệp đều có .tên của chúng, vì vậy */*nói chung mẫu rất tệ.

Đây là một thực thi sạch sẽ phù hợp với tôi. Các câu trả lời trước đây hiển thị các thư mục trong kết quả mà tôi không muốn.
AWP

Bạn cần thêm nhiều phiếu bầu! Trên thực tế (trên windows) tôi đã phải sử dụng basename($file)để chỉ lấy tên tệp thay vì toàn bộ đường dẫn với tên tệp.
Pauloco

10

Tôi có mã nhỏ hơn để làm điều này:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}

Trả lại cho tôi tất cả các tệp trừ hai tệp rác có tên "." và "..". Tôi không có bất kỳ tệp nào có tên "." và ".." trong thư mục của tôi.
kamranbhatti585 12/1217

1
Sử dụng $ files = array_diff (scandir ($ path), array ('.', '..')); để giải phóng các lỗi trên mà tôi đã thảo luận.
kamranbhatti585 12/1217

Đẹp. làm cách nào để xóa phần mở rộng cho các tệp? (Tôi cần xóa .phptrên mỗi tệp.)
KSPR

8

Trên một số hệ điều hành bạn nhận được . ...DS_Store, Chúng tôi không thể sử dụng chúng, vì vậy chúng ta hãy ẩn chúng đi.

Trước tiên, hãy bắt đầu lấy tất cả thông tin về các tệp, sử dụng scandir()

// Folder where you want to get all files names from
$dir = "uploads/";

/* Hide this */
$hideName = array('.','..','.DS_Store');    

// Sort in ascending order - this is default
$files = scandir($dir);
/* While this to there no more files are */
foreach($files as $filename) {
    if(!in_array($filename, $hideName)){
       /* echo the name of the files */
       echo "$filename<br>";
    }
}

4

Đó là do sự tin cậy của người vận hành. Hãy thử thay đổi nó thành:

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);

2

glob()và các FilesystemIteratorví dụ:

/* 
 * glob() examples
 */

// get the array of full paths
$result = glob( 'path/*' );

// get the array of file names
$result = array_map( function( $item ) {
    return basename( $item );
}, glob( 'path/*' ) );


/* 
 * FilesystemIterator examples
 */

// get the array of file names by using FilesystemIterator and array_map()
$result = array_map( function( $item ) {
    // $item: SplFileInfo object
    return $item->getFilename();
}, iterator_to_array( new FilesystemIterator( 'path' ), false ) );

// get the array of file names by using FilesystemIterator and iterator_apply() filter
$it = new FilesystemIterator( 'path' );
iterator_apply( 
    $it, 
    function( $item, &$result ) {
        // $item: FilesystemIterator object that points to current element
        $result[] = (string) $item;
        // The function must return TRUE in order to continue iterating
        return true;
    }, 
    array( $it, &$result )
);

1

Bạn chỉ có thể thử scandir(Path)chức năng. nó nhanh chóng và dễ thực hiện

Cú pháp:

$files = scandir("somePath");

Hàm này trả về một danh sách tệp vào một Mảng.

để xem kết quả, bạn có thể thử

var_dump($files);

Hoặc là

foreach($files as $file)
{ 
echo $file."< br>";
} 



0

Tôi chỉ sử dụng mã này:

<?php
    $directory = "Images";
    echo "<div id='images'><p>$directory ...<p>";
    $Files = glob("Images/S*.jpg");
    foreach ($Files as $file) {
        echo "$file<br>";
    }
    echo "</div>";
?>


0

Mã đệ quy để khám phá tất cả tệp có trong một thư mục ('$ path' chứa đường dẫn của thư mục):

function explore_directory($path)
{
    $scans = scandir($path);

    foreach($scans as $scan)
    {
        $new_path = $path.$scan;

        if(is_dir($new_path))
        {
            $new_path = $new_path."/";
            explore_directory($new_path);
        }
        else // A file
        {
            /*
                  Body of code
            */
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.