當前位置: 首頁> 最新文章列表> 如何利用PHP 的md5_file() 函數結合scandir() 實現批量生成文件指紋?

如何利用PHP 的md5_file() 函數結合scandir() 實現批量生成文件指紋?

M66 2025-06-15

在實際開發中,文件指紋(文件哈希值)是一種常見的需求,用於驗證文件完整性、防止篡改,或者實現文件去重等功能。 PHP 提供了強大的內置函數md5_file() ,可以方便地獲取文件的MD5 哈希值。結合scandir()函數,可以輕鬆實現對指定目錄下所有文件的批量指紋生成。

本文將詳細介紹如何使用md5_file()scandir()來實現批量生成文件指紋,並給出完整的示例代碼。


1. 函數簡介

  • md5_file(string $filename): string|false

    計算指定文件的MD5 散列值,返回32 位的字符串,如果讀取失敗則返回false。

  • scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING): array|false

    獲取指定目錄下的所有文件和子目錄,返回包含文件名的數組。


2. 實現思路

  1. 利用scandir()獲取目標目錄下的所有文件和文件夾名稱。

  2. 過濾掉目錄項中的特殊目錄...

  3. 遍歷所有文件,使用md5_file()獲取其MD5 指紋。

  4. 將文件名與對應的MD5 值存儲到數組或輸出。


3. 示例代碼

<?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;
}
?>

4. 注意事項

  • 目錄路徑需要寫成服務器上的實際路徑,確保PHP 腳本有權限讀取該目錄。

  • 該示例代碼僅處理指定目錄的第一層文件,不會遞歸子目錄。如果需要遞歸,可配合遞歸函數或RecursiveDirectoryIterator實現。

  • md5_file()適合小文件快速生成指紋,大文件建議採用分塊計算哈希值,避免內存溢出。


5. 拓展:結合URL 遠程文件的處理

有時,我們需要對遠程文件生成指紋。雖然md5_file()支持遠程文件URL,但如果遠程服務器限制訪問,可能會失敗。建議先下載文件到本地臨時目錄再計算。

示例(示意):