PHP: 如何列出目录中的文件而不列出子目录

13

以下是我列出目录中文件的代码起始部分:

$files = scandir($dir); 
$array = array(); 
foreach($files as $file)
{
    if($file != '.' && $file != '..' && !is_dir($file)){
          ....

我试图列出一个目录中的所有文件但不包括子文件夹。这段代码可以工作,但是会列出文件和文件夹。我在上面的代码中添加了 !is_dir($file) 语句,但结果仍然相同。

6个回答

26

我认为应该是这样的:

$files = scandir($dir); 
foreach($files as $file)
{
    if(is_file($dir.$file)){
      ....

1
由于'.'和'..'是目录,所以在表达式中"$file != '.' && $file != '..' &&" 是多余的。而且末尾的目录分隔符没有任何区别。 - symcbean

8

只需使用is_file

示例:

foreach($files as $file)
{
    if( is_file($file) )
    {
       // Something
    }
}

我可以这样做,但是针对我的具体示例,我想知道为什么 is_dir() 不起作用。谢谢 +1 - Pinkie

2
这将扫描文件,然后检查数组中是否有 . 或 ..。然后将不包括 . 和 .. 的文件推入新的 files[] 数组中。
尝试这个:
$scannedFiles = scandir($fullPath);
$files = [];

foreach ($scannedFiles as $file) {
    if (!in_array(trim($file), ['.', '..'])) {
        $files[] = $file;
    }
}

你好,欢迎来到StackOverflow。请为代码添加一些解释。 - Chait

1
对于看似简单的事情来说,真是太麻烦了!对我来说,什么都没用……为了获得结果,我假设文件名必须有一个扩展名,在我的情况下。
if ($handle = opendir($opendir)) {
    while (false !== ($entry = readdir($handle))) {
        $pos = strpos( $entry, '.' );
        if ($entry != "." && $entry != ".." && is_numeric($pos)  ) {

............ 很好的条目


好的,你指出了这一点,但是仍然有每天都有没有点的文件名。 - dachi

1
使用DIRECTORY_SEPARATOR常量将文件附加到其目录路径中。
    function getFileNames($directoryPath) {
        $fileNames = [];
        $contents = scandir($directoryPath);

        foreach($contents as $content) {
            if(is_file($directoryPath . DIRECTORY_SEPARATOR . $content)) {
                array_push($fileNames, $content);
            }
        }

        return $fileNames;
    }

1
这是一个快速简单的一行代码,仅列出文件。由于用户想要列出文件,因此无需扫描目录并返回所有内容并排除目录。只需获取任何类型或特定类型的文件。使用*来返回所有文件而不考虑扩展名,或通过将*替换为扩展名来获取具有特定扩展名的文件。
获取所有文件而不考虑扩展名:
$files = glob($dir . DIRECTORY_SEPARATOR . "*");

获取所有扩展名为php的文件:
$files = glob($dir . DIRECTORY_SEPARATOR . "*.php");

获取所有扩展名为 js 的文件:
$files = glob($dir . DIRECTORY_SEPARATOR . "*.js");

我在我的网站上使用以下内容:
function fileList(string $directory, string $extension="") :array
{
    $filetype = '*';
    if(!empty($extension) && mb_substr($extension, 0, 1, "UTF-8") != '.'):
        $filetype .= '.' . $extension;
    else:
        $filetype .= $extension;
    endif;
    return glob($directory . DIRECTORY_SEPARATOR . $filetype);
}

使用方法:

$files = fileList($configData->includesDirectory, '');

通过我的自定义函数,我可以包含一个扩展名或将其留空。另外,我可能会忘记在扩展名前面加上“.”,但仍然可以成功运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接