2015-07-04 3 views
2

Итак, у меня есть каталог, в котором я получаю хэши для всех файлов в каталоге при записи/добавлении хэшей для каждого файла в текстовый документ, который я получаю в том же хэше 10-100 раз в документе, и я не могу понять, почему php продолжает это делать.PHP foreach duplicate looping issue

Любой может запустить это в окнах, чтобы убедиться, что certutil, который выполняет скрипт, встроен в окна, поэтому он будет работать на любой машине 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); 
     } 
    } 
} 
?> 

ответ

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; 
+0

Я покинул первую строку find_hash с пространством, поэтому его технически не пусто. Кроме того, причина, по которой я использую «certutil.exe» вместо встроенного в sha1_file php, состоит в том, что файлы имеют размер более 2 ГБ, а php не может читать файлы размером более 2 ГБ на окнах. – C0nw0nk

+1

@ C0nw0nk Я понимаю, я пошел с sha1_file только для целей тестирования. Вы можете использовать certutil.exe. Он все еще порождает повторяющийся хеш? – JungleZombie

+0

Да, похоже, что это было трюк благодаря JungleZombie :) было так встревожено, что никогда не сталкивался с этой проблемой раньше. – C0nw0nk