2011-10-20 108 views
0

我厭倦了從PC加載文件到我的應用程序。然後以十六進制讀取文件。 現在我有這些代碼,一切都很好,小文件大小。小於1 GB文件加載文件到陣列

我的問題是

我們都知道HEX文件閱讀器像(十六進制編輯器車間6 ...和十六進制編輯器新

我下載這些和我讀到(36 GB)(39,490,420,735字節)的文件十六進制 Ram存儲器中沒有任何保存字節 ???

IN vb.Net當我嘗試讀取文件超過1GB的十六進制的數組。>的Windows 7沒有響應

我知道那是因爲我在我的機器有2GB!

那是什麼(十六進制車間)使用無論負載大小

此的任何文件的方式是,我使用的代碼。

X = String.Join(" ", IO.File.ReadAllBytes("Location of file").Select(Function(b) b.ToString("X2")).ToArray()) 

請問有什麼想法?

回答

0

這些程序使用的Paging

基本上,他們只在文件的一部分,在一次讀取的形式,他們還記得他們最後讀的地方,那麼當用戶滾動他們取的另一個「頁面」來自文件的數據。

.Net 4.0包括直接支持Memory Mapped Files這可能會有所幫助,但即使沒有API,這也是非常簡單的。

例如簡單的(未經測試的)分頁類。

Public Class PagedFile 
    Implements IDisposable 

    Private stream As IO.BinaryReader 
    Private pageSize As Integer 
    Public Sub New(fileName As String, pageSize As Integer) 
     stream = New IO.BinaryReader(New IO.FileStream(fileName, IO.FileMode.Open)) 
     Me.pageSize = pageSize 
    End Sub 

    Public ReadOnly Property PageCount As Integer 
     Get 
      Dim pages As Double = stream.BaseStream.Length/pageSize 
      If stream.BaseStream.Length Mod pageSize = 0 Then 
       Return CInt(pages) 
      Else 
       Return CInt(Math.Floor(pages)) + 1 
      End If 
     End Get 
    End Property 

    ' 0 is the first page 
    Public Function GetPage(pageNo As Integer) As Byte() 
     If (pageNo < 0) Then 
      Throw New ArgumentOutOfRangeException("pageNo", "Must be greater than zero") 
     End If 
     If (pageNo >= PageCount) Then 
      Throw New ArgumentOutOfRangeException("pageNo", "Must be less than the number of pages in this file: " & PageCount) 
     End If 
     stream.BaseStream.Seek(pageNo * pageSize, IO.SeekOrigin.Begin) 
     Return stream.ReadBytes(pageSize) 
    End Function 

#Region "IDisposable Support" 
End Class 

希望這會有所幫助。

更新
很抱歉,但我不明白你在您的評論要求的。
在您的用戶界面中,您只需要記住自己所在的頁面,並在用戶滾動時抓取下一頁(或同時保存3頁,前一頁,當前頁和下一頁),作爲用戶頁面您可以立即顯示下一個頁面,並可以異步獲取另一個(新的下一個頁面),或者當UI空閒時。

NB它可能是有意義的有一個「頁」是不是用戶所看到的更大,從而使用戶不會等待他們每次打Page Down關鍵時期。