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.");
}
}
}
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
vâng, tôi đang tạo một chương trình nhỏ để xóa các bản sao. – Michel