2010-05-27 30 views
55

Đối với một số lý do, tôi tiếp tục nhận được một '1' cho tên tập tin với mã này:Bắt tên của tất cả các file trong một thư mục với PHP

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

Khi Tôi xin nhắc lại mỗi phần tử trong $ results_array, tôi nhận được một loạt các '1', không phải là tên của tập tin. Làm thế nào để tôi có được tên của các tập tin?

+1

Có một vài tùy chọn sử dụng [glob] (http://us2.php.net/glob). – allnightgrocery

+0

có thể trùng lặp của [Nhận phân cấp của một thư mục với PHP] (http://stackoverflow.com/questions/660644/get-the-hierarchy-of-a-directory-with-php) –

+1

Vấn đề mà người đăng nhiệm vụ đó 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 $ file. Việc sửa chữa duy nhất cần thiết là sử dụng ($ file = readdir ($ handle))! == FALSE " – Omn

Trả lời

119

Đừng bận tâm với mở/readdir và sử dụng glob thay vì:

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

Bạn có thể muốn bọc một' mảng_filter (..., 'is_file') 'quanh glob đó vì câu hỏi yêu cầu các tệp – salathe

+14

Không phải tất cả các tên tập tin đều có dạng '*. *': Chỉ sử dụng '*' thay thế. – jameshfisher

+0

Làm cách nào để có được 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

4

Đó là do điều hành precidence. Hãy thử thay đổi nó thành:

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

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

Ở đây bạn đi:

$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 />'; 
} 
+0

Không chắc chắn tại sao đây không phải là câu trả lời được chấp nhận ... – Omn

5

tôi có mã todo nhỏ này:

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

Rất tuyệt ... hoạt động hoàn hảo ... Cảm ơn bạn đã mã ... –

+0

Trả lại tất cả các tệp nhưng 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

+0

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

34

SPL phong cách:

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

Kiểm tra DirectoryIteratorSplFileInfo lớp dành cho danh sách các phương pháp có sẵn mà bạn có thể sử dụng.

+0

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

+0

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

2

glob()FilesystemIterator ví 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) 
); 
0

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

Đầu tiên bắt đầu nhận được tất cả thông tin về các tập tin, sử dụng scandir()

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

// Sort in ascending order - this is default 
$files = scandir($dir); 

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

/* 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>$filename}";<br>"; 
    } 
} 
8

Khi trả lời chấp nhận có hai thiếu hụt quan trọng, tôi gửi bài trả lời cải thiện cho những người mới tìm kiếm câu trả lời đúng:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file) 
{ 
    // Do something with $file 
} 
  1. Lọc các kết quả chức năng globe với is_file là 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 là . trong tên của chúng, vì vậy, */* mẫu không được nói chung.
0

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

Cú pháp:

$files = scandir("somePath"); 

Chức năng này trả về một danh sách các tập tin vào một mảng.

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

var_dump($files); 

Hoặc

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ả các tệp chứa 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 
      */ 
     } 
    } 
} 
Các vấn đề liên quan