在實際開發中,文件指紋(文件哈希值)是一種常見的需求,用於驗證文件完整性、防止篡改,或者實現文件去重等功能。 PHP 提供了強大的內置函數md5_file() ,可以方便地獲取文件的MD5 哈希值。結合scandir()函數,可以輕鬆實現對指定目錄下所有文件的批量指紋生成。
本文將詳細介紹如何使用md5_file()和scandir()來實現批量生成文件指紋,並給出完整的示例代碼。
md5_file(string $filename): string|false
計算指定文件的MD5 散列值,返回32 位的字符串,如果讀取失敗則返回false。
scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING): 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 腳本有權限讀取該目錄。
該示例代碼僅處理指定目錄的第一層文件,不會遞歸子目錄。如果需要遞歸,可配合遞歸函數或RecursiveDirectoryIterator實現。
md5_file()適合小文件快速生成指紋,大文件建議採用分塊計算哈希值,避免內存溢出。
有時,我們需要對遠程文件生成指紋。雖然md5_file()支持遠程文件URL,但如果遠程服務器限制訪問,可能會失敗。建議先下載文件到本地臨時目錄再計算。
示例(示意):