2010-03-02 39 views
17

nói rằng tôi có tệp A.doc.
sau đó tôi sao chép nó vào b.doc và di chuyển nó sang thư mục khác.
đối với tôi, nó vẫn là cùng một tệp.
nhưng làm cách nào tôi có thể xác định đó là?
khi tôi tải xuống các tệp mà đôi khi tôi đọc về việc nhận mda5 một cái gì đó hoặc tổng kiểm tra, nhưng tôi không biết đó là gì.cách kiểm tra xem 2 tệp có bằng .NET không?

Có cách nào để kiểm tra xem các tệp này có nhị phân không?

+0

Bạn có muốn làm điều này theo chương trình, nếu không này sẽ phù hợp hơn trên SuperUser.com? – cjk

+0

vâng, tôi đang tạo một chương trình nhỏ để xóa các bản sao. – Michel

Trả lời

14

Nếu bạn muốn chắc chắn 100% byte chính xác trong tệp là như nhau, thì việc mở hai luồng và so sánh từng byte của tệp là cách duy nhất.

Nếu bạn chỉ muốn khá chắc chắn (99,9999%?), Tôi sẽ tính giá trị băm MD5 của mỗi tệp và so sánh băm thay thế. Kiểm tra System.Security.Cryptography.MD5CryptoServiceProvider.

Trong thử nghiệm của tôi, nếu các tệp thường tương đương thì so sánh băm MD5 nhanh gấp ba lần so với từng byte của tệp.
Nếu các tệp thường khác nhau thì so sánh từng byte sẽ nhanh hơn nhiều, vì bạn không phải đọc toàn bộ tệp, bạn có thể dừng ngay khi một byte khác nhau.

Chỉnh sửa: Tôi ban đầu dựa vào câu trả lời này cho một bài kiểm tra nhanh được đọc từ từng tệp từng byte và so sánh từng byte theo byte. Tôi giả định rằng bản chất đệm của System.IO.FileStream sẽ tiết kiệm cho tôi khỏi lo lắng về kích thước khối đĩa cứng và tốc độ đọc; điều này không đúng. Tôi đã thử lại chương trình đọc từ mỗi tệp trong 4096 byte và sau đó so sánh các khối - phương pháp này nhanh hơn một chút so với MD5 ngay cả khi các tệp giống hệt nhau và dĩ nhiên sẽ nhanh hơn nếu chúng khác nhau.

Tôi để lại câu trả lời này là một cảnh báo nhẹ về lớp FileStream và bởi vì tôi vẫn nghĩ rằng có một số giá trị như một câu trả lời cho "làm cách nào để tính MD5 của tệp trong .NET". Ngoài ra, đó không phải là cách tốt nhất để đáp ứng yêu cầu ban đầu.

ví dụ về tính toán băm MD5 của hai tập tin (nay là thử nghiệm!):

using (var reader1 = new System.IO.FileStream(filepath1, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 
{ 
    using (var reader2 = new System.IO.FileStream(filepath2, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 
    { 
     byte[] hash1; 
     byte[] hash2; 

     using (var md51 = new System.Security.Cryptography.MD5CryptoServiceProvider()) 
     { 
      md51.ComputeHash(reader1); 
      hash1 = md51.Hash; 
     } 

     using (var md52 = new System.Security.Cryptography.MD5CryptoServiceProvider()) 
     { 
      md52.ComputeHash(reader2); 
      hash2 = md52.Hash; 
     } 

     int j = 0; 
     for (j = 0; j < hash1.Length; j++) 
     { 
      if (hash1[j] != hash2[j]) 
      { 
       break; 
      } 
     } 

     if (j == hash1.Length) 
     { 
      Console.WriteLine("The files were equal."); 
     } 
     else 
     { 
      Console.WriteLine("The files were not equal."); 
     } 
    } 
} 
+4

Mặc dù mã này là "ngắn hơn", nó chắc chắn chậm hơn đáng kể và thường tồi tệ hơn so sánh từng byte một. Chưa kể MD5 là một băm chết (mật mã nói). Tôi thực sự không làm điều này, nếu bạn chỉ muốn kiểm tra xem các tập tin có bình đẳng không. –

+1

@ silky: Tôi nghi ngờ điều này phụ thuộc vào kích thước của tệp và liệu trường hợp sử dụng có cơ hội cao hơn hay không, nhưng tính toán MD5 của hai tệp nhanh gấp ba lần so với nội dung của chúng theo byte byte. – Coxy

+7

@silky: MD5 là một mã băm chết mã hóa có ít hoặc không mang về việc sử dụng nó như một băm so sánh cho một tệp lớn. – Tanzelax

2

Thực tế là có. Mở cả hai tệp, đọc chúng dưới dạng mảng byte và so sánh từng byte. Nếu chúng bằng nhau, thì tệp sẽ bằng nhau.

8

Đầu tiên so sánh kích thước tệp, nếu kích thước không giống nhau thì tệp khác nhau, nếu kích thước giống nhau, thì chỉ cần so sánh nội dung tệp.

Các vấn đề liên quan