2011-09-08 89 views
1

大文件我有一個Windows窗體應用程序文件異步使用BackgroundWorker哈希值。我通過檢查每個散列文件之間的CancellationPending來實現取消。散列本身基本上是這樣的:散列在後臺線程

var sha1 = new SHA1CryptoServiceProvider(); 
byte[] hash = sha1.ComputeHash(
    new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); 

與唯一的問題是特別大的文件 - 百兆或千兆字節的大小 - 哈希運算塊取消,直至完成該文件。

什麼會改變這一點的最好方式,以便當文件被混編取消可檢查 - 例如每ñ毫秒或每ñ字節?

回答

1

使用TransformBlock和TransformFinalBlock而不是ComputeHash,從信息流對哈希算法手動抽數據 - 然後插入在循環取消檢查。

1

SHA1是塊友好。讀取數據塊文件,使用TransformBlock(),則TransformFinalBlock()當文件結束。

2

你可以創建你自己的撤銷流並提供這作爲輸入到哈希函數。沿着這些方向的東西:

class CancellableFileStream : FileStream { 

    readonly BackgroundWorker backgroundWorker; 

    public CancellableFileStream(BackgroundWorker backgroundWorker, String path, FileMode mode, FileAccess access, FileShare share) 
    : base(path, mode, access, share) { 
    this.backgroundWorker = backgroundWorker; 
    } 

    public override Int32 Read(Byte[] array, Int32 offset, Int32 count) { 
    if (this.backgroundWorker.CancellationPending) 
     return 0; 
    return base.Read(array, offset, count); 
    } 

} 
+0

最好在取消時拋出一個異常 - 否則,調用者可能會將正確的文件結尾與取消混淆。此外,你不知道的內存多大SHA1的工作塊,因此你不知道如何ofter將取消標誌進行檢查。 –