获取目录中的最新文件,包括子目录 php

Get latest file in dir including subdirectory php

我发现我可以使用

$files = scandir('c:\myfolder', SCANDIR_SORT_DESCENDING);
$newest_file = $files[0];

获取给定目录中的最新文件 ('myfolder')。 有没有简单的方法来获取包含子目录的最新文件?

喜欢:

我的文件夹> dir1 > file_older1.txt

我的文件夹> dir2 > dir3 > newest_file_in_maindir.txt

我的文件夹> dir4 > file_older2.txt

提前致谢

据我所知,您必须递归检查每个文件夹和文件以获得最后修改的文件。你当前的解决方案不检查最后修改的文件,而是按名称降序排列文件。

意思是,如果您有一个名为 z.txt 的 10 年前的文件,它可能会排在最前面。

我想出了一个解决方案。

  1. 该函数接受目录名并确保目录 存在。当目录没有文件或其任何子目录时,return为空。
  2. 搁置变量 $latest$latestTime,其中存储最后修改的文件。
  3. 它循环遍历目录,避免 ...,因为它们会导致无限递归循环。
  4. 在循环中,完整的文件名由初始目录名和部分组成。
  5. 检查文件名是否是一个目录,如果是,它调用我们所在的相同函数并保存结果。
  6. 如果结果为空,我们 continue 循环,否则我们将文件保存为新文件名,我们现在知道这是一个文件。
  7. 之后,我们使用 filemtime 检查最后修改时间,看看 $latestTime 是否更小,这意味着文件修改时间早于当前文件。
  8. 如果新文件确实更年轻,我们将新值保存到 $latest$latestTime,其中 $latest 是文件名。
  9. 当循环结束时,我们 return 结果。
function find_last_modified_file(string $dir): ?string
{
    if (!is_dir($dir)) throw new \ValueError('Expecting a valid directory!');

    $latest = null;
    $latestTime = 0;
    foreach (scandir($dir) as $path) if (!in_array($path, ['.', '..'], true)) {
        $filename = $dir . DIRECTORY_SEPARATOR . $path;

        if (is_dir($filename)) {
            $directoryLastModifiedFile = find_last_modified_file($filename);

            if (null === $directoryLastModifiedFile) {
                continue;
            } else {
                $filename = $directoryLastModifiedFile;
            }
        }

        $lastModified = filemtime($filename);
        if ($lastModified > $latestTime) {
            $latestTime = $lastModified;
            $latest = $filename;
        }
    }

    return $latest;
}

echo find_last_modified_file(__DIR__);

在第 7 步中,如果同时修改了两个文件,则存在一种极端情况,这取决于您要如何解决。我选择保留初始文件的修改时间而不是更新它。