仕事で、ファイル整理するための情報を集めるプログラムを組んでいます。 ファイルパスのString型を渡すとハッシュ値がString型で帰ってくる関数で 解決しようとしたのですが、現在の私の開発環境では500MByteくらいの ファイルサイズを越えるとファイル内容のメモリへの読みこみの時点 #My.Computer.FileSystem.ReadAllBytes(file) でOutOfMemoryExceptionでエラーになってしまいます。 Private Function GetSHA256(ByVal file As String) As String Dim data As Byte() Try data = My.Computer.FileSystem.ReadAllBytes(file) Catch ex As OutOfMemoryException Return "<HASH_OUTOFMEMORY_FAILED>" Exit Function End Try Dim result() As Byte Dim shaM As New SHA256Managed() result = shaM.ComputeHash(data) Return BitConverter.ToString(result).Replace("-", "") End Function VB2005、Framework2.0の標準的な機能で実装しようとした (SHA256Managed)為にいったん全ファイル内容をバイト列に 取り込まないといけなくなっているのが問題なのは分かります。 自力で考えると以下の解決策が浮かぶのですが、どの手が良いのか、 また具体的な実装の書き方が分からず悩んでおります。 どなたかアドバイスをいただけないでしょうか。
Private Function GetSHA256(ByVal file As String) As String
Dim fs As FileStream = Nothing Try fs = New FileStream(file, FileMode.Open) Dim result() As Byte Dim shaM As New SHA256Managed() result = shaM.ComputeHash(fs) Return BitConverter.ToString(result).Replace("-", "") Catch ex As OutOfMemoryException Return HASH_OUTOFMEMORY_FAILED ' 念のため Finally fs.Close() End Try
Exit Function
今テストを始めました。
1GByte程度のファイルに対して1ファイルあたり2分くらい。
Intel(R) Pentium(R) 4 CPU 3.40GHz
3393 MHz
(GenuineIntel Family F Model 3 Stepping 4)
L2 Cache=512 KB
CPU の数 2
物理メモリ (空き/総容量): 426 MB/0.99 GB (41%)
仮想メモリ (空き/総容量): 1.96 GB/1.99 GB (98%)
ページファイル (空き/総容量): 1.52 GB/2.40 GB (63%)