2013-07-22 4 views
0

두 파일을 비교하여 두 번째 파일이 첫 번째 파일에서 수정되었는지 확인하려고합니다.동일한 내용의 md5sum 값이 서로 다릅니다.

이 구현에서는 두 파일의 md5_file()을 비교할 계획입니다. 그러나 문제는 원본 파일이 유닉스 라인 코딩에 의해 만들어지고 두 번째 파일이 어떤 종류의 라인 코딩 (유닉스, 맥 또는 윈도우)이 될 수 있다는 것이다. 따라서 파일 비교는 항상 실패합니다. 이 문제를 해결하는 방법은 무엇입니까?

두 파일에서 공백을 제거하려고 시도했지만 비교를 진행했습니다. 그러나이 방법도 실패합니다. 문제를 해결할 다른 방법이 있습니까?

두 번째 파일을 복사하거나 변경하지 않아야합니다. 원본을 보존 할 수 있도록

$file1 = md5(preg_replace('/\s/', '', file_get_contents($file1))); 
$file2 = md5(preg_replace('/\s/', '', file_get_contents($file2))); 

if ($file1 == $file2) 
    continue; 

답변

1

단순히 유닉스 스타일로 두 번째 파일의 라인 엔딩을 모두 교체 다음과 같이 나 자신을 고정 있지만 임시 파일을 어떻게에만 또는.

+0

아니요, 제 2 파일을 복사하거나 변경하지 않아야합니다. – Santhanakumar

+1

당신은되지 않을 것입니다. 일관된 방식으로 파일을 '해석'하게됩니다. –

+1

'COPY'를 정의하십시오. 아무 것도하지 않고 메모리에 복사해야합니다. –

1

파일의 크기에 따라 인코딩을 고려하여 문자열로 읽은 다음 해당 문자열을 md5 할 수 있습니다.

$file1 = file_get_contents($file_url_1); 
    $file2 = file_get_contents($file_url_2); 

    $file1 = mb_convert_encoding($file1, "UTF-8", "whateverEncoding"); 
    $file2 = mb_convert_encoding($file2, "UTF-8", "whateverOtherEncoding"); 

    if (md5($file1) == md5($file2)) 

    .... 
+0

전체 파일 내용을 읽는 경우 md5를 계산하고 합계를 비교하는 대신 비교하지 않는 것이 좋습니다. 그리고 문자열로 변환하는 대신 파일의 바이트 값에서 md5 합계를 만드는 것이 훨씬 낫습니다. – Dainius

+0

@Dainius 음, "현재"버전의 md5 문자열을 저장할 수 있으므로 항상 두 파일 대신 새 파일을 해시해야한다고 가정합니다. 그러나 그렇습니다, ByteArray는 말을 할 것입니다. – dognose

관련 문제