Chỉnh sửa: Tôi đã đổi tên này thành ví dụ khi mã hoạt động như mong đợi.C# MD5 hasher example
Tôi đang cố gắng sao chép tệp, nhận băm MD5, sau đó xóa bản sao. Tôi đang làm điều này để tránh khóa quy trình trên tệp gốc, mà một ứng dụng khác ghi vào đó. Tuy nhiên, tôi đang nhận được một khóa trên tập tin tôi đã sao chép.
File.Copy(pathSrc, pathDest, true);
String md5Result;
StringBuilder sb = new StringBuilder();
MD5 md5Hasher = MD5.Create();
using (FileStream fs = File.OpenRead(pathDest))
{
foreach(Byte b in md5Hasher.ComputeHash(fs))
sb.Append(b.ToString("x2").ToLower());
}
md5Result = sb.ToString();
File.Delete(pathDest);
Tôi sau đó nhận được 'quy trình không thể truy cập tệp' ngoại lệ trên File.Delete()
'.
Tôi hy vọng rằng với tuyên bố using
, luồng phim sẽ bị đóng độc đáo. Tôi cũng đã cố gắng khai báo riêng dòng phim, xóa using
và đặt fs.Close()
và fs.Dispose()
sau khi đọc.
Sau này, tôi nhận xét tính toán md5 thực sự, và đoạn mã excutes, với tập tin bị xóa, do đó, nó trông giống như nó là một cái gì đó để làm với ComputeHash(fs)
.
Tại sao bạn không chỉ gọi ReadAllBytes() và được thực hiện với nó? – BobbyShaftoe
Bởi vì cuộc gọi của anh ta để computeHash hoạt động trên luồng - nếu tệp lớn, anh ta sẽ không cần phải giữ tất cả trong bộ nhớ. –
Bạn không cần đóng tệp trước khi xóa nó? – JonnyBoats