2015-01-22 3 views
0

간단한 기능을 가진 VB.NET 2010에서 프로그램을 만들려고합니다. 텍스트 파일에 저장된 수천 개의 MD5 해시를 파일을 여는 동안 프로그램이 자동으로 계산하는 MD5 해시 파일과 비교해야합니다. 바이러스 백신 스캐너와 같습니다. 사실 내 프로그램은 텍스트 파일에서 모든 해시를 텍스트 상자에 추가 한 다음 비교합니다. ReadAllText 시스템을 사용합니다.VB.NET MD5 큰 파일을 사용하여 비교

Md5 데이터베이스 (해시가있는 텍스트 파일)는 작지만 파일이 커지면 내 프로그램이 열리기 만하기 때문에 ReadAllText 대신 ReadLine을 사용하기로 결정했습니다.

이제 텍스트 상자를 사용할 수 없으므로 비교할 수있는 방법을 알려주십시오. 방법을 시도했지만 작동하지 않는 것 같습니다.

여기 내 코드는 ReadLine입니다.

문제 If Read contains(buff.tostring)에 그것이 textbox.text은 (buff.toString)이 포함되어있는 경우

여기서 I는 제 기능을 분할하는 기능을 만드는 것이 코드

Try 
      TextBox2.Text = e.FullPath 
      ListBox3.Items.Add(TextBox2.Text.ToString) 
      Me.OpenFileDialog1.FileName = "" 
      Dim reader As StreamReader = New StreamReader("def.txt") 
      Dim read = reader.ReadLine() 
      Dim md5 As New MD5CryptoServiceProvider 
      Dim f As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read, &H2000) 
      f = New FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read, &H2000) 
      md5.ComputeHash(f) 
      Dim hash As Byte() = md5.Hash 
      Dim buff As New StringBuilder 
      Dim hashByte As Byte 
      For Each hashByte In hash 
       buff.Append(String.Format("{0:X2}", hashByte)) 
      Next 
      f.Close() 
      If read.Contains(buff.ToString) Then 
       Me.OpenFileDialog1.FileName = e.FullPath 
       Form2.ShowDialog() 

      End If 

     Catch exception1 As Exception 
      ProjectData.SetProjectError(exception1) 
      Dim ex As Exception = exception1 
      ProjectData.ClearProjectError() 
     End Try 
+0

List (of String)를 사용하여 해시 목록을 저장합니다. 또는 File.ReadLines를 배열로 가져 와서 거기에서 사용하십시오. – Plutonix

+0

어떻게? 더 노골적으로 말하십시오. 파일이 매우 크다 (20 MB) – KingOfBSOD

+0

내 코드를 수정하여 답변으로 올릴 수 있다면 괜찮겠습니까. 그렇게한다면 내 질문에 대한 대답으로 표시하고 싶습니다. 감사! – KingOfBSOD

답변

1

이다 이어야하는데 사용된다. 나중에 코드를 이해하는 것이 훨씬 쉽습니다. 목록에 해시를 저장하면이 목록을 캐시 할 수 있습니다.

Try 

    TextBox2.Text = e.FullPath 
    ListBox3.Items.Add(TextBox2.Text.ToString) 
    Me.OpenFileDialog1.FileName = "" 

    Dim allHash As List(Of String) = GetAllHash() 
    Dim curHash As String = GetFileHash(e.FullPath) 

    If allHash.Contains(curHash) Then 
     Me.OpenFileDialog1.FileName = e.FullPath 
     Form2.ShowDialog() 
    End If 

Catch exception1 As Exception 
    ProjectData.SetProjectError(exception1) 
    Dim ex As Exception = exception1 
    ProjectData.ClearProjectError() 
End Try 

Function GetAllHash() As List(Of String) 

    ' Store the data in a list instead 
    Return System.IO.File.ReadAllLines("def.txt").ToList() 
End Function 

Function GetFileHash(ByVal filename As String) As String 

    Dim md5 As New MD5CryptoServiceProvider 
    ' Only open the file once 
    Dim f As New FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, &H2000) 
    md5.ComputeHash(f) 
    Dim hash As Byte() = md5.Hash 
    Dim buff As New StringBuilder 

    For Each hashByte As Byte In hash 
     buff.Append(String.Format("{0:X2}", hashByte)) 
    Next 

    f.Close() 

    Return buff.ToString() 
End Function 
  • 이 코드를 컴파일하지 않았다, 이것은 무엇을 할 수 있는지를 보여 단지 예입니다.
+0

@ F.C.E.365 예제에서 e.FullPath가 있습니다. 20MB 파일의 경우 동결되지 않아야합니다. 파일을 변경하지 않으면 목록이 다른 시간을 사용하도록 어딘가에 저장되어 있으면 ReadAllLines을 한 번만 수행 할 수 있습니다. –