前言:
只是测试了读取一两百M的文件,感觉还是比较快,好像不能读超过2G以上的文件,我试一下读取3G的文件,没有反应。操作大文件可以参考一下这文
http://support.microsoft.com/kb/189981/zh-cn
下面是我写的一个类,下班了由于时间关系,就没有进行过多的测试:代码如下:
Public Class ReadBigTxt
Private m_LogPath As String = ""
Public Sub New()
End Sub
Public Function GetFileTxt(ByVal filename As String) As String
Dim str As String = ""
Try
Dim vFileHandle As IntPtr = NativeMethods.CreateFileA(filename, &H80000000UI Or &H40000000UI, 0, IntPtr.Zero, NativeMethods.OPEN_ALWAYS, NativeMethods.FILE_ATTRIBUTE_NORMAL Or _
NativeMethods.FILE_FLAG_SEQUENTIAL_SCAN, _
IntPtr.Zero)
If NativeMethods.INVALID_HANDLE_VALUE <> CInt(vFileHandle) Then
Dim vMappingHandle As IntPtr = NativeMethods.CreateFileMappingA(vFileHandle, IntPtr.Zero, NativeMethods.PAGE_READWRITE, 0, 0, "temp")
If vMappingHandle <> IntPtr.Zero Then
Dim vHead As IntPtr = NativeMethods.MapViewOfFile(vMappingHandle, NativeMethods.FILE_MAP_COPY Or NativeMethods.FILE_MAP_READ Or NativeMethods.FILE_MAP_WRITE, 0, 0, 0)
If vHead <> IntPtr.Zero Then
Dim vSize As UInteger = NativeMethods.GetFileSize(vFileHandle, IntPtr.Zero)
Dim nb As Byte() = New Byte(CInt(vSize - 1)) {}
System.Runtime.InteropServices.Marshal.Copy(vHead, nb, 0, nb.Length)
str = System.Text.Encoding.GetEncoding("GB2312").GetString(nb)
nb = Nothing
NativeMethods.UnmapViewOfFile(vHead)
End If
NativeMethods.CloseHandle(vMappingHandle)
End If
NativeMethods.CloseHandle(vFileHandle)
End If
Catch ex As Exception
Throw
End Try
Return str 'str.Replace(vbCr, "").Replace(vbLf, "")
End Function
End Class
<System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)> _
Public Structure SECURITY_ATTRIBUTES
'''PAGE_READWRITE -> 0x04
Public Const PAGE_READWRITE As Integer = 4
'''DWORD->unsigned int
Public nLength As UInteger
'''LPVOID->void*
Public lpSecurityDescriptor As System.IntPtr
'''BOOL->int
<System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)> _
Public bInheritHandle As Boolean
End Structure
Partial Public Class NativeMethods
Public Const OPEN_ALWAYS As Integer = 4
Public Const INVALID_HANDLE_VALUE As Integer = -1
'''PAGE_READWRITE -> 0x04
Public Const PAGE_READWRITE As Integer = 4
'''FILE_FLAG_SEQUENTIAL_SCAN -> 0x08000000
Public Const FILE_FLAG_SEQUENTIAL_SCAN As Integer = 134217728
'''GENERIC_WRITE -> (0x40000000L)
Public Const GENERIC_WRITE As Integer = 1073741824
'''FILE_ATTRIBUTE_NORMAL -> 0x00000080
Public Const FILE_ATTRIBUTE_NORMAL As Integer = 128
'''GENERIC_READ -> (0x80000000L)
Public Const GENERIC_READ As Integer = -2147483648
'FILE_MAP_COPY -> SECTION_QUERY
Public Const FILE_MAP_COPY As Integer = 1
'''SECTION_QUERY -> 0x0001
Public Const SECTION_QUERY As Integer = 1
'FILE_MAP_READ -> SECTION_MAP_READ
Public Const FILE_MAP_READ As Integer = 4
'''SECTION_MAP_READ -> 0x0004
Public Const SECTION_MAP_READ As Integer = 4
' Private Const GENERIC_WRITE = &H40000000
' Private Const GENERIC_READ = &H80000000
'FILE_MAP_WRITE -> SECTION_MAP_WRITE
Public Const FILE_MAP_WRITE As Integer = 2
'''SECTION_MAP_WRITE -> 0x0002
Public Const SECTION_MAP_WRITE As Integer = 2
'''Return Type: HANDLE->void*
'''lpFileName: LPCSTR->CHAR*
'''dwDesiredAccess: DWORD->unsigned int
'''dwShareMode: DWORD->unsigned int
'''lpSecurityAttributes: LPSECURITY_ATTRIBUTES->_SECURITY_ATTRIBUTES*
'''dwCreationDisposition: DWORD->unsigned int
'''dwFlagsAndAttributes: DWORD->unsigned int
'''hTemplateFile: HANDLE->void*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="CreateFileA")> _
Public Shared Function CreateFileA(<System.Runtime.InteropServices.InAttribute(), System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)> ByVal lpFileName As String, ByVal dwDesiredAccess As UInteger, ByVal dwShareMode As UInteger, <System.Runtime.InteropServices.InAttribute()> ByVal lpSecurityAttributes As System.IntPtr, ByVal dwCreationDisposition As UInteger, ByVal dwFlagsAndAttributes As UInteger, <System.Runtime.InteropServices.InAttribute()> ByVal hTemplateFile As System.IntPtr) As System.IntPtr
End Function
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="CreateFileW")> _
Public Shared Function CreateFileW(<System.Runtime.InteropServices.InAttribute(), System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)> ByVal lpFileName As String, ByVal dwDesiredAccess As UInteger, ByVal dwShareMode As UInteger, <System.Runtime.InteropServices.InAttribute()> ByVal lpSecurityAttributes As System.IntPtr, ByVal dwCreationDisposition As UInteger, ByVal dwFlagsAndAttributes As UInteger, <System.Runtime.InteropServices.InAttribute()> ByVal hTemplateFile As System.IntPtr) As System.IntPtr
End Function
'''Return Type: BOOL->int
'''hObject: HANDLE->void*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="CloseHandle")> _
Public Shared Function CloseHandle(<System.Runtime.InteropServices.InAttribute()> ByVal hObject As System.IntPtr) As <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)> Boolean
End Function
'''Return Type: HANDLE->void*
'''hFile: HANDLE->void*
'''lpFileMappingAttributes: LPSECURITY_ATTRIBUTES->_SECURITY_ATTRIBUTES*
'''flProtect: DWORD->unsigned int
'''dwMaximumSizeHigh: DWORD->unsigned int
'''dwMaximumSizeLow: DWORD->unsigned int
'''lpName: LPCSTR->CHAR*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="CreateFileMappingA")> _
Public Shared Function CreateFileMappingA(<System.Runtime.InteropServices.InAttribute()> ByVal hFile As System.IntPtr, <System.Runtime.InteropServices.InAttribute()> ByVal lpFileMappingAttributes As System.IntPtr, ByVal flProtect As UInteger, ByVal dwMaximumSizeHigh As UInteger, ByVal dwMaximumSizeLow As UInteger, <System.Runtime.InteropServices.InAttribute(), System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)> ByVal lpName As String) As System.IntPtr
End Function
'''Return Type: BOOL->int
'''lpBaseAddress: LPCVOID->void*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="UnmapViewOfFile")> _
Public Shared Function UnmapViewOfFile(<System.Runtime.InteropServices.InAttribute()> ByVal lpBaseAddress As System.IntPtr) As <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)> Boolean
End Function
'''Return Type: LPVOID->void*
'''hFileMappingObject: HANDLE->void*
'''dwDesiredAccess: DWORD->unsigned int
'''dwFileOffsetHigh: DWORD->unsigned int
'''dwFileOffsetLow: DWORD->unsigned int
'''dwNumberOfBytesToMap: SIZE_T->ULONG_PTR->unsigned int
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="MapViewOfFile")> _
Public Shared Function MapViewOfFile(<System.Runtime.InteropServices.InAttribute()> ByVal hFileMappingObject As System.IntPtr, ByVal dwDesiredAccess As UInteger, ByVal dwFileOffsetHigh As UInteger, ByVal dwFileOffsetLow As UInteger, ByVal dwNumberOfBytesToMap As UInteger) As System.IntPtr
End Function
'''Return Type: DWORD->unsigned int
'''hFile: HANDLE->void*
'''lpFileSizeHigh: LPDWORD->DWORD*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="GetFileSize")> _
Public Shared Function GetFileSize(<System.Runtime.InteropServices.InAttribute()> ByVal hFile As System.IntPtr, ByVal lpFileSizeHigh As System.IntPtr) As UInteger
End Function
End Class
Private m_LogPath As String = ""
Public Sub New()
End Sub
Public Function GetFileTxt(ByVal filename As String) As String
Dim str As String = ""
Try
Dim vFileHandle As IntPtr = NativeMethods.CreateFileA(filename, &H80000000UI Or &H40000000UI, 0, IntPtr.Zero, NativeMethods.OPEN_ALWAYS, NativeMethods.FILE_ATTRIBUTE_NORMAL Or _
NativeMethods.FILE_FLAG_SEQUENTIAL_SCAN, _
IntPtr.Zero)
If NativeMethods.INVALID_HANDLE_VALUE <> CInt(vFileHandle) Then
Dim vMappingHandle As IntPtr = NativeMethods.CreateFileMappingA(vFileHandle, IntPtr.Zero, NativeMethods.PAGE_READWRITE, 0, 0, "temp")
If vMappingHandle <> IntPtr.Zero Then
Dim vHead As IntPtr = NativeMethods.MapViewOfFile(vMappingHandle, NativeMethods.FILE_MAP_COPY Or NativeMethods.FILE_MAP_READ Or NativeMethods.FILE_MAP_WRITE, 0, 0, 0)
If vHead <> IntPtr.Zero Then
Dim vSize As UInteger = NativeMethods.GetFileSize(vFileHandle, IntPtr.Zero)
Dim nb As Byte() = New Byte(CInt(vSize - 1)) {}
System.Runtime.InteropServices.Marshal.Copy(vHead, nb, 0, nb.Length)
str = System.Text.Encoding.GetEncoding("GB2312").GetString(nb)
nb = Nothing
NativeMethods.UnmapViewOfFile(vHead)
End If
NativeMethods.CloseHandle(vMappingHandle)
End If
NativeMethods.CloseHandle(vFileHandle)
End If
Catch ex As Exception
Throw
End Try
Return str 'str.Replace(vbCr, "").Replace(vbLf, "")
End Function
End Class
<System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)> _
Public Structure SECURITY_ATTRIBUTES
'''PAGE_READWRITE -> 0x04
Public Const PAGE_READWRITE As Integer = 4
'''DWORD->unsigned int
Public nLength As UInteger
'''LPVOID->void*
Public lpSecurityDescriptor As System.IntPtr
'''BOOL->int
<System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)> _
Public bInheritHandle As Boolean
End Structure
Partial Public Class NativeMethods
Public Const OPEN_ALWAYS As Integer = 4
Public Const INVALID_HANDLE_VALUE As Integer = -1
'''PAGE_READWRITE -> 0x04
Public Const PAGE_READWRITE As Integer = 4
'''FILE_FLAG_SEQUENTIAL_SCAN -> 0x08000000
Public Const FILE_FLAG_SEQUENTIAL_SCAN As Integer = 134217728
'''GENERIC_WRITE -> (0x40000000L)
Public Const GENERIC_WRITE As Integer = 1073741824
'''FILE_ATTRIBUTE_NORMAL -> 0x00000080
Public Const FILE_ATTRIBUTE_NORMAL As Integer = 128
'''GENERIC_READ -> (0x80000000L)
Public Const GENERIC_READ As Integer = -2147483648
'FILE_MAP_COPY -> SECTION_QUERY
Public Const FILE_MAP_COPY As Integer = 1
'''SECTION_QUERY -> 0x0001
Public Const SECTION_QUERY As Integer = 1
'FILE_MAP_READ -> SECTION_MAP_READ
Public Const FILE_MAP_READ As Integer = 4
'''SECTION_MAP_READ -> 0x0004
Public Const SECTION_MAP_READ As Integer = 4
' Private Const GENERIC_WRITE = &H40000000
' Private Const GENERIC_READ = &H80000000
'FILE_MAP_WRITE -> SECTION_MAP_WRITE
Public Const FILE_MAP_WRITE As Integer = 2
'''SECTION_MAP_WRITE -> 0x0002
Public Const SECTION_MAP_WRITE As Integer = 2
'''Return Type: HANDLE->void*
'''lpFileName: LPCSTR->CHAR*
'''dwDesiredAccess: DWORD->unsigned int
'''dwShareMode: DWORD->unsigned int
'''lpSecurityAttributes: LPSECURITY_ATTRIBUTES->_SECURITY_ATTRIBUTES*
'''dwCreationDisposition: DWORD->unsigned int
'''dwFlagsAndAttributes: DWORD->unsigned int
'''hTemplateFile: HANDLE->void*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="CreateFileA")> _
Public Shared Function CreateFileA(<System.Runtime.InteropServices.InAttribute(), System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)> ByVal lpFileName As String, ByVal dwDesiredAccess As UInteger, ByVal dwShareMode As UInteger, <System.Runtime.InteropServices.InAttribute()> ByVal lpSecurityAttributes As System.IntPtr, ByVal dwCreationDisposition As UInteger, ByVal dwFlagsAndAttributes As UInteger, <System.Runtime.InteropServices.InAttribute()> ByVal hTemplateFile As System.IntPtr) As System.IntPtr
End Function
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="CreateFileW")> _
Public Shared Function CreateFileW(<System.Runtime.InteropServices.InAttribute(), System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)> ByVal lpFileName As String, ByVal dwDesiredAccess As UInteger, ByVal dwShareMode As UInteger, <System.Runtime.InteropServices.InAttribute()> ByVal lpSecurityAttributes As System.IntPtr, ByVal dwCreationDisposition As UInteger, ByVal dwFlagsAndAttributes As UInteger, <System.Runtime.InteropServices.InAttribute()> ByVal hTemplateFile As System.IntPtr) As System.IntPtr
End Function
'''Return Type: BOOL->int
'''hObject: HANDLE->void*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="CloseHandle")> _
Public Shared Function CloseHandle(<System.Runtime.InteropServices.InAttribute()> ByVal hObject As System.IntPtr) As <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)> Boolean
End Function
'''Return Type: HANDLE->void*
'''hFile: HANDLE->void*
'''lpFileMappingAttributes: LPSECURITY_ATTRIBUTES->_SECURITY_ATTRIBUTES*
'''flProtect: DWORD->unsigned int
'''dwMaximumSizeHigh: DWORD->unsigned int
'''dwMaximumSizeLow: DWORD->unsigned int
'''lpName: LPCSTR->CHAR*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="CreateFileMappingA")> _
Public Shared Function CreateFileMappingA(<System.Runtime.InteropServices.InAttribute()> ByVal hFile As System.IntPtr, <System.Runtime.InteropServices.InAttribute()> ByVal lpFileMappingAttributes As System.IntPtr, ByVal flProtect As UInteger, ByVal dwMaximumSizeHigh As UInteger, ByVal dwMaximumSizeLow As UInteger, <System.Runtime.InteropServices.InAttribute(), System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)> ByVal lpName As String) As System.IntPtr
End Function
'''Return Type: BOOL->int
'''lpBaseAddress: LPCVOID->void*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="UnmapViewOfFile")> _
Public Shared Function UnmapViewOfFile(<System.Runtime.InteropServices.InAttribute()> ByVal lpBaseAddress As System.IntPtr) As <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)> Boolean
End Function
'''Return Type: LPVOID->void*
'''hFileMappingObject: HANDLE->void*
'''dwDesiredAccess: DWORD->unsigned int
'''dwFileOffsetHigh: DWORD->unsigned int
'''dwFileOffsetLow: DWORD->unsigned int
'''dwNumberOfBytesToMap: SIZE_T->ULONG_PTR->unsigned int
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="MapViewOfFile")> _
Public Shared Function MapViewOfFile(<System.Runtime.InteropServices.InAttribute()> ByVal hFileMappingObject As System.IntPtr, ByVal dwDesiredAccess As UInteger, ByVal dwFileOffsetHigh As UInteger, ByVal dwFileOffsetLow As UInteger, ByVal dwNumberOfBytesToMap As UInteger) As System.IntPtr
End Function
'''Return Type: DWORD->unsigned int
'''hFile: HANDLE->void*
'''lpFileSizeHigh: LPDWORD->DWORD*
<System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="GetFileSize")> _
Public Shared Function GetFileSize(<System.Runtime.InteropServices.InAttribute()> ByVal hFile As System.IntPtr, ByVal lpFileSizeHigh As System.IntPtr) As UInteger
End Function
End Class
代码是根据C#转过来,然后自己在找的相应API的声明写的。
这里在给CreateFile的参数进行给值时提示:常量表达式无法在类型“UInteger”中表示
如下这段代码:
Dim vFileHandle As IntPtr = NativeMethods.CreateFileA(filename, &H80000000UI Or &H40000000UI, 0,
需要在&H8000000加上UI,具体原因,我也不知道,时间关系,先不研究了!
调用:
Dim r As New ReadBigTxt
Dim f As New System.Windows.Forms.OpenFileDialog
If f.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim t = Now
Debug.WriteLine(r.GetFileTxt(f.FileName))
MsgBox(t.ToString & " " & Now.ToString)
End If
Dim f As New System.Windows.Forms.OpenFileDialog
If f.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim t = Now
Debug.WriteLine(r.GetFileTxt(f.FileName))
MsgBox(t.ToString & " " & Now.ToString)
End If
初步测试了一下,打开一两百M的文件,还是比较快,就几秒种!