40

だから私は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ディレクトリのドキュメントを見つけて理解することができなかったので、役立つリソースもいただければ幸いです。ありがとうございました。

4

4 に答える 4

68

ディレクトリ内の唯一のファイルにタイムスタンプ付きのファイル名があると仮定しscandirて、を使用してみます。

$files = scandir('data', SCANDIR_SORT_DESCENDING);
$newest_file = $files[0];

最初にディレクトリ内のすべてのファイルを降順でリストします。次に、そのリストの最初にあるファイルのファイル名が「最大」であるため、タイムスタンプ値が最大であるため、最新のものになります。

これscandirはPHP5で追加されましたが、そのドキュメントページには、PHP4でその動作を実装する方法が示されています。

于 2012-07-22T02:56:00.027 に答える
8

ワイルドカードを使用した検索には、次のものを使用できます。

<?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;
?>
于 2021-01-20T15:07:13.297 に答える
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
于 2021-06-22T18:09:09.190 に答える
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);
}

タイムスタンプの代わりにこの手動比較を使用すると、より外科的な結果を得ることができます。同様の要件がある場合、これがいくつかの有用なアイデアを提供できることを願っています。

(追記:私が持っていた特定の要件に関して見つけた答えに満足できなかったので、投稿するのに時間がかかりました。StackOverflowにもあまり慣れていないので親切にしてください-ありがとう!)

于 2021-07-02T22:37:31.430 に答える