使用PHP获取目录中所有文件的名称


87

出于某种原因,我使用以下代码将文件名始终保持为“ 1”:

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

当我在$ results_array中回显每个元素时,我得到了一堆“ 1”,而不是文件名。如何获得文件名?


1
使用glob有一些选择。
allnightgrocery 2010年


1
发布者遇到的问题是分配的优先级非常低,因此首先对'!=='运算符求值,然后将该操作的二进制结果分配给$ file。唯一需要解决的方法是使用($ file = readdir($ handle))!== FALSE“
Omn


从69票对70票。我感觉就像汉克·穆迪
查理(Charlie)

Answers:


167

不要打扰open / readdir,glob而改用:

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

24
您可能想array_filter(..., 'is_file')在该glob中包装一个,因为问题要求提供文件。
萨拉特

23
并非所有文件名都具有以下格式*.*:仅使用即可*
jameshfisher 2014年

我们如何在扩展名列表中获取所有文件?例如,如果我们需要所有.php和.js文件?
Nis 2014年

3
是的,这个答案不是很可靠。文件不需要扩展名,目录可以命名something.something。最好使用array_filterglob($log_directory.'/*')
2014年

我赞成这个提议,因为我只需要简单的答案,而用例的所有相关文件都将是*.*。更加健壮的表达方式将使它成为一个更好的答案。
TecBrat


18

您需要$file = readdir($handle)用括号括起来。

干得好:

$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

由于已接受的答案有两个重要缺陷,因此我为那些寻求正确答案的新手发布了改进的答案:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. 过滤globe函数结果is_file是必要的,因为它也可能返回一些目录。
  2. 并非所有文件.的名称都带有a ,因此*/*模式通常很烂。

这对我有用。以前的答案在结果中显示了我不想要的目录。
AWP

先生,您需要更多投票!实际上(在Windows上)我不得不用来basename($file)仅获取文件名,而不是获取带有filename的整个路径。
Pauloco

10

我有较小的代码来做到这一点:

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

除了两个名为“。”的垃圾文件外,返回所有文件。和“ ..”。我没有任何名为“。”的文件。和“ ..”在我的目录中。
kamranbhatti585

1
使用$ files = array_diff(scandir($ path),array('。','..')); 释放上面讨论的错误。
kamranbhatti585

真好 如何删除文件扩展名?(我需要删除.php每个文件。)
KSPR

8

在某些操作系统上,您会获得. ...DS_Store,那么我们将无法使用它们,因此让我们将其隐藏起来。

首先开始使用获取有关文件的所有信息 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

这是由于操作员的过错。尝试将其更改为:

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

2

glob()FilesystemIterator示例:

/* 
 * 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

您可以尝试该scandir(Path)功能。它快速且易于实现

句法:

$files = scandir("somePath");

该函数将文件列表返回到数组中。

查看结果,您可以尝试

var_dump($files);

要么

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



0

我只使用以下代码:

<?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

递归代码以浏览目录中包含的所有文件(“ $ path”包含目录的路径):

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
            */
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.