所以我有这个处理CSV文件的应用程序。我有一行代码来加载文件。
$myFile = "data/FrontlineSMS_Message_Export_20120721.csv"; //The name of the CSV file
$fh = fopen($myFile, 'r'); //Open the file
我想找到一种方法,我可以查看data
目录并获取最新文件(它们都有日期标记,因此它们将在data
内部按顺序排列)并设置名称等于$myFile
。
我真的找不到并理解php目录的文档,所以任何有用的资源也会受到赞赏。谢谢。
答案 0 :(得分:42)
这是使用scandir
的尝试,假设目录中的唯一文件是您想要的带时间戳的文件:
$files = scandir('data', SCANDIR_SORT_DESCENDING);
$newest_file = $files[0];
我们首先按降序列出目录中的所有文件,然后,该列表中的第一个文件具有“最大”文件名 - 因此是最大的时间戳值 - 因此是最新的。
请注意,{5}中添加了scandir
,但its documentation page显示了如何在PHP 4中实现该行为。
答案 1 :(得分:4)
对于带有通配符的搜索,您可以使用:
<?php
$path = "/var/www/html/*";
$latest_ctime = 0;
$latest_filename = '';
$files = glob($path);
foreach($files as $file)
{
if (is_file($file) && filectime($file) > $latest_ctime)
{
$latest_ctime = filectime($file);
$latest_filename = $file;
}
}
return $latest_filename;
?>
答案 2 :(得分:0)
我的解决方案,来自 Max Hofmann 的改进解决方案:
$ret = [];
$dir = Yii::getAlias("@app") . "/web/uploads/problem-letters/{$this->id}"; // set directory in question
if(is_dir($dir)) {
$ret = array_diff(scandir($dir), array(".", "..")); // get all files in dir as array and remove . and .. from it
}
usort($ret, function ($a, $b) use ($dir) {
if(filectime($dir . "/" . $a) < filectime($dir . "/" . $b)) {
return -1;
} else if(filectime($dir . "/" . $a) == filectime($dir . "/" . $b)) {
return 0;
} else {
return 1;
}
}); // sort array by file creation time, older first
echo $ret[count($ret)-1]; // filename of last created file
答案 3 :(得分:0)
这里有一个例子,在这个例子中,我对使用自己的验证器更有信心,而不是简单地依赖带有 scandir() 的时间戳。
在这种情况下,我想检查我的服务器的文件版本是否比客户端的版本更新。所以我根据文件名比较版本号。
$clientAppVersion = "1.0.5";
$latestVersionFileName = "";
$directory = "../../download/updates/darwin/"
$arrayOfFiles = scandir($directory);
foreach ($arrayOfFiles as $file) {
if (is_file($directory . $file)) {
// Your custom code here... For example:
$serverFileVersion = getVersionNumberFromFileName($file);
if (isVersionNumberGreater($serverFileVersion, $clientAppVersion)) {
$latestVersionFileName = $file;
}
}
}
// function declarations in my php file (used in the forEach loop)
function getVersionNumberFromFileName($fileName) {
// extract the version number with regEx replacement
return preg_replace("/Finance D - Tenue de livres-darwin-(x64|arm64)-|\.zip/", "", $fileName);
}
function removeAllNonDigits($semanticVersionString) {
// use regex replacement to keep only numeric values in the semantic version string
return preg_replace("/\D+/", "", $semanticVersionString);
}
function isVersionNumberGreater($serverFileVersion, $clientFileVersion): bool {
// receives two semantic versions (1.0.4) and compares their numeric value (104)
// true when server version is greater than client version (105 > 104)
return removeAllNonDigits($serverFileVersion) > removeAllNonDigits($clientFileVersion);
}
使用这个手动比较而不是时间戳,我可以获得更手术的结果。如果你有类似的需求,我希望这能给你一些有用的想法。
(PS:我花时间发帖是因为我对找到的与我的特定要求相关的答案不满意。请善待我也不太习惯 StackOverflow - 谢谢!)