所以我有一个目录,我在写入/将每个文件的哈希值添加到文本文档时,为目录中的所有文件获取哈希值我在文档中以相同的哈希结尾10-100次结束无法弄清楚为什么php继续这样做。
任何人都可以在Windows上运行它来自己查看脚本执行的certutil内置到windows中,以便它可以在任何Windows机器上运行。
<?php
$file_path = 'C:\Users\C0n\Desktop\hash-banned.txt';
foreach (glob("R:\backup\Videos\*") as $filename) {
exec('CertUtil -hashfile "'.$filename.'" SHA1', $response);
$str = str_replace(' ', '', $response[1]);
$find_hashes = file($file_path,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($find_hashes as $n1) {
if($str == $n1) {
echo "duplicate detected";
break;
}
echo "Hash does not exist so adding " . $str;
//hash not found so add to file
//if hash string is not empty then write to file
if ($str != "") {
file_put_contents($file_path, $str . "\n", FILE_APPEND);
}
}
}
?>
答案 0 :(得分:2)
如果文件为空,$ str如何最终写入文件?因为$ find_hashes也将为空,并且foreach将不会运行。 测试下面的代码,似乎与我一起正常工作。
$str = sha1_file($filename);
$find_hashes = file($file_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// unsetting response returned by certutil
// because exec() appends output lines to the end of the array
unset($response);
if (in_array($str, $find_hashes)) {
echo "duplicate detected";
continue;
}
if ($str != "") file_put_contents($file_path, $str . "\n", FILE_APPEND);
echo "Hash does not exist so adding " . $str;