获取目录中的最新文件,包括子目录 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 年前的文件,它可能会排在最前面。
我想出了一个解决方案。
- 该函数接受目录名并确保目录
存在。当目录没有文件或其任何子目录时,return为空。
- 搁置变量
$latest
和 $latestTime
,其中存储最后修改的文件。
- 它循环遍历目录,避免
.
和 ..
,因为它们会导致无限递归循环。
- 在循环中,完整的文件名由初始目录名和部分组成。
- 检查文件名是否是一个目录,如果是,它调用我们所在的相同函数并保存结果。
- 如果结果为空,我们
continue
循环,否则我们将文件保存为新文件名,我们现在知道这是一个文件。
- 之后,我们使用
filemtime
检查最后修改时间,看看 $latestTime
是否更小,这意味着文件修改时间早于当前文件。
- 如果新文件确实更年轻,我们将新值保存到
$latest
和 $latestTime
,其中 $latest
是文件名。
- 当循环结束时,我们 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 步中,如果同时修改了两个文件,则存在一种极端情况,这取决于您要如何解决。我选择保留初始文件的修改时间而不是更新它。
我发现我可以使用
$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 年前的文件,它可能会排在最前面。
我想出了一个解决方案。
- 该函数接受目录名并确保目录 存在。当目录没有文件或其任何子目录时,return为空。
- 搁置变量
$latest
和$latestTime
,其中存储最后修改的文件。 - 它循环遍历目录,避免
.
和..
,因为它们会导致无限递归循环。 - 在循环中,完整的文件名由初始目录名和部分组成。
- 检查文件名是否是一个目录,如果是,它调用我们所在的相同函数并保存结果。
- 如果结果为空,我们
continue
循环,否则我们将文件保存为新文件名,我们现在知道这是一个文件。 - 之后,我们使用
filemtime
检查最后修改时间,看看$latestTime
是否更小,这意味着文件修改时间早于当前文件。 - 如果新文件确实更年轻,我们将新值保存到
$latest
和$latestTime
,其中$latest
是文件名。 - 当循环结束时,我们 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 步中,如果同时修改了两个文件,则存在一种极端情况,这取决于您要如何解决。我选择保留初始文件的修改时间而不是更新它。