2015-01-22 2 views
0

Я пытаюсь создать программу в VB.NET 2010, которая имеет простую функциональность. Он должен сравнивать тысячи MD5 хэшей, хранящихся в текстовом файле, в текущем файле MD5 Hash, который автоматически вычисляется при открытии файла. Как антивирусный сканер. На самом деле моя программа использует систему ReadAllText, чтобы добавить все хэши из текстового файла в текстовое поле, а затем сравнить их.VB.NET MD5 Сравнение с использованием больших файлов

В любом случае, когда база данных Md5 (этот текстовый файл с хэшами) мала, но когда файл становится больше, моя программа просто зависает после открытия, поэтому я решил использовать ReadLine вместо ReadAllText.

Теперь я больше не могу использовать текстовое поле, поэтому дайте мне способ, как я могу их сравнить. Я пробовал путь, но он, похоже, не работает.

Вот мой код, используя ReadLine.

Проблема на If Read contains(buff.tostring) он будет использоваться Если TextBox.Text содержит (buff.toString)

Вот код

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

Используйте список (из строки) для хранения списка хеш-листов. или использовать File.ReadLines, получить их как массив и использовать его оттуда – Plutonix

+0

Как? Будьте более ясны. Файл очень БОЛЬШОЙ (20 МБ) – 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 из вашего примера. Он не должен замерзать для файла размером 20 МБ. Если файл никогда не изменяется, ReadAllLines может быть выполнен только один раз, если список хранится где-то, чтобы использовать другое время. –