对API不是很熟悉,现在我要处理一些大文件,文件长度比如为2GB。如果我要从第1024字节开始连续读入50字节,该如何编写程序?另外,如果我要将一个byte数组写入到指定文件区域(比如从第2048字节到第4096字节),应该怎么处理?我大概知道应该使用CreateFile、ReadFile以及WriteFile这几个API函数,但是不会用!!!

解决方案 »

  1.   

    读文件:
    Option Explicit
    Const FILE_BEGIN = 0
    Const OFS_MAXPATHNAME = 128
    Const OF_CREATE = &H1000
    Const OF_READ = &H0
    Const OF_WRITE = &H1
    Private Type OFSTRUCT
            cBytes As Byte
            fFixedDisk As Byte
            nErrCode As Integer
            Reserved1 As Integer
            Reserved2 As Integer
            szPathName(OFS_MAXPATHNAME) As Byte
    End Type
    Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
    Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long
    Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Sub Command1_Click()
        Dim mfile As String
        Dim hFile As Long
        Dim OF As OFSTRUCT
        mfile = "e:\mc\mmtest.jpg"
        hFile = OpenFile(mfile, OF, OF_READ)
        Dim buff() As Byte
        ReDim buff(50 - 1)
        SetFilePointer hFile, 1024, 0, FILE_BEGIN
        Dim ret As Long
        ReadFile hFile, buff(0), 50, ret, ByVal 0&
        If ret <> 50 Then
            MsgBox "error"
        End If
        CloseHandle hFile
    End Sub写文件和这个类似,就不罗嗦了,说明一下用SetFilePointer设置当前的读写位置
      

  2.   

    Declare Function SetFilePointer Lib "kernel32" Alias "SetFilePointer" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long在一个文件中设置当前的读写位置
    Long,返回一个新位置,它采用从文件起始处开始算起的一个字节偏移量。HFILE_ERROR意味着出错。会设置GetLastError
    hFile ----------  Long,系统文件句柄
    lDistanceToMove -  Long,字节偏移量
     lpDistanceToMoveHigh -  Long,指定一个长整数变量,其中包含了要使用的一个高双字偏移。可设为零(将声明变为ByVal),表示只使用lDistanceToMove
      原文:A long variable containing a high double word offset to use. May be zero (change
      declaration to ByVal) to use only lDistanceToMove.  dwMoveMethod ---  Long,下述常数之一
      FILE_BEGIN
      lOffset将新位置设为从文件起始处开始算的起的一个偏移
      FILE_CURRENT
      lOffset将新位置设为从当前位置开始计算的一个偏移
      FILE_END
      lOffset将新位置设为从文件尾开始计算的一个偏移这个函数与vb的seek语句类似。不要将函数用于通过vb的open命令打开的文件。利用这个函数,可以处理那些长度大于2^64字节的大型文件
      

  3.   

    KAO,发觉自己笨死了VB里面的Get、Put和Seek函数就足够了……为什么还要API?
      

  4.   

    //VB里面的Get、Put和Seek函数就足够了……为什么还要API?呵呵,用api快一些