2

重複の可能性:
C# で SHA1 の大きなファイル (2 GB 以上) をハッシュする

用語のサイズが大きいファイルがあり、「'System.OutOfMemoryException' 型の例外がスローされました」というエラーが表示されます。

誰でもこの問題を解決するためのアイデアや解決策を持っています。助けてください。サンプルコード....

 private string GetSha1()
    {
        string filePath = txtFileName.Text;
        byte[] filebytes = System.IO.File.ReadAllBytes(filePath);
        byte[] hashValue;
        SHA1Managed hashString = new SHA1Managed();

        string hex = "";

        hashValue = hashString.ComputeHash(filebytes);
        foreach (byte x in hashValue)
        {
            hex += String.Format("{0:x2}", x);
        }
        return hex;
    }

上記のコードの下の行で例外が発生しています....

   byte[] filebytes = System.IO.File.ReadAllBytes(filePath);

filePath には、サイズが 500MB を超えるファイルがあります。

4

3 に答える 3

13

ファイル全体をメモリに読み込む代わりに、ストリームを ComputeHash に渡すだけです

using(var file = File.Open(path,FileMode.Open))
{
   hashValue = hashString.ComputeHash(file);
}
于 2012-08-20T13:36:14.037 に答える
2

さて、あなたは問題が何であるかをかなり説明しました。を使用しているため、500MB のファイルを に直接読み込もうとしてbyte[]いますReadAllBytes()。これは、小さなファイル以外にはあまり適していません。

ファイルのハッシュを計算したい場合は、引数としてストリームを使用してください:

using (filestream f = File.Open(path,FileMode.Open))
{
    hashValue = hashString.ComputeHash(f);
}
于 2012-08-20T13:37:54.947 に答える
1

System.IO.File.Readファイル全体を一度に読み取るのではなく、一度にファイルのチャンクを使用してバイト配列に読み取る必要があるかもしれません。

の使用については、 MSDNのこの例を参照してくださいRead

于 2012-08-20T13:37:32.370 に答える