2011-10-20 140 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关键时期。