実際の開発では、ファイルフィンガープリント(ファイルハッシュ値)は一般的な要件であり、ファイルの整合性を検証したり、改ざんを防ぎ、ファイルの重複排除やその他の機能を実装したりするために使用されます。 PHPは、ファイルのMD5ハッシュ値を簡単に取得できる強力な組み込み関数md5_file()を提供します。 Scandir()関数と組み合わせることで、指定されたディレクトリ内のすべてのファイルのバッチフィンガープリント生成を簡単に実現できます。
この記事では、Md5_file()とScandir()を使用してファイル指紋のバッチ生成を実現し、完全なサンプルコードを提供する方法を詳細に紹介します。
md5_file(string $ filename):string | false
指定されたファイルのMD5ハッシュ値を計算し、32ビット文字列を返し、読み取りが失敗した場合にfalseを返します。
Scandir(String $ directory、int $ sorting_order = scandir_sort_assending):array | false
指定されたディレクトリ内のすべてのファイルとサブディレクトリを取得し、ファイル名を含む配列を返します。
Scandir()を使用して、ターゲットディレクトリですべてのファイルとフォルダー名を取得します。
特別なディレクトリを除外します。および...ディレクトリアイテム。
すべてのファイルを反復し、 MD5_File()を使用してMD5指紋を取得します。
ファイル名と対応するMD5値を配列または出力に保存します。
<?php
$directory = '/path/to/your/files'; // スキャンするディレクトリパスに置き換えます
// ディレクトリをスキャンします
$files = scandir($directory);
if ($files === false) {
die('ディレクトリの読み取りは失敗しました');
}
$fileHashes = [];
foreach ($files as $file) {
// 除外します '.' そして '..'
if ($file === '.' || $file === '..') {
continue;
}
$filePath = $directory . DIRECTORY_SEPARATOR . $file;
// ファイルのみを処理します,サブディレクトリを無視します
if (is_file($filePath)) {
$hash = md5_file($filePath);
if ($hash !== false) {
$fileHashes[$file] = $hash;
} else {
$fileHashes[$file] = '読み取り失敗';
}
}
}
// 出力結果
foreach ($fileHashes as $filename => $md5) {
echo "ファイル名:{$filename},MD5 指紋:{$md5}" . PHP_EOL;
}
?>
ディレクトリパスは、PHPスクリプトがディレクトリを読み取る許可を確保するために、サーバー上の実際のパスとして記述する必要があります。
このサンプルコードは、指定されたディレクトリ内のファイルの最初のレイヤーのみを処理し、サブディレクトリに再発しません。再帰が必要な場合は、再帰関数または再帰的なrecurectoryiteratorと組み合わせて実装できます。
md5_file()は、小さなファイルの速い指紋生成に適しています。チャンクを使用してハッシュ値を計算して、メモリのオーバーフローを避けることをお勧めします。
場合によっては、リモートファイルに指紋を生成する必要があります。 MD5_FILE()はリモートファイルURLをサポートしていますが、リモートサーバーがアクセスを制限すると失敗する可能性があります。計算する前に、ファイルをローカル一時ディレクトリにダウンロードすることをお勧めします。
例(回路図):