看了这个帖子:  
http://www.vbgood.com/thread-99249-1-1.html  
就写了一个使用API读写文件的简单类,苦力活。  
演示代码在附件里。  
'***********************************  
'Written by D.L.  
'  
'2011/04/04  
'***********************************  
Option Explicit  
  
'Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long  
'Private Type SECURITY_ATTRIBUTES  
'    nLength As Long  
'    lpSecurityDescriptor As Long  
'    bInheritHandle As Long  
'End Type  
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long  
Private Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long  
Private Declare Function WriteFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, ByRef lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long  
Private Declare Function FlushFileBuffers Lib "kernel32" (ByVal hFile As Long) As Long  
'Private Declare Function GetFileSize Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpFileSizeHigh As Long) As Long  
Private Declare Function GetFileSizeEx Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpFileSize As Currency) As Long  
  
Enum DesiredAccess  
    GENERIC_READ = &H80000000  
    GENERIC_WRITE = &H40000000  
    GENERIC_EXECUTE = &H20000000  
    GENERIC_ALL = &H10000000  
End Enum  
  
Enum ShareMode  
    FILE_SHARE_READ = &H1  
    FILE_SHARE_WRITE = &H2  
    FILE_SHARE_DELETE = &H4  
End Enum  
  
'This parameter must be one of the following values, which cannot be combined:  
Enum CreationDisposition  
    TRUNCATE_EXISTING = 5  
    OPEN_ALWAYS = 4  
    OPEN_EXISTING = 3  
    CREATE_ALWAYS = 2  
    CREATE_NEW = 1  
End Enum  
  
Enum FlagsAndAttributes  
    'attributes  
    FILE_ATTRIBUTE_ARCHIVE = &H20  
    FILE_ATTRIBUTE_COMPRESSED = &H800  
    FILE_ATTRIBUTE_DIRECTORY = &H10  
    FILE_ATTRIBUTE_HIDDEN = &H2  
    FILE_ATTRIBUTE_NORMAL = &H80 'The file does not have other attributes set. This attribute is valid only if used alone.  
    FILE_ATTRIBUTE_READONLY = &H1  
    FILE_ATTRIBUTE_SYSTEM = &H4  
    FILE_ATTRIBUTE_TEMPORARY = &H100  
    'flags  
    FILE_FLAG_BACKUP_SEMANTICS = &H2000000  
    FILE_FLAG_DELETE_ON_CLOSE = &H4000000  
    FILE_FLAG_NO_BUFFERING = &H20000000  
    FILE_FLAG_OVERLAPPED = &H40000000  
    FILE_FLAG_POSIX_SEMANTICS = &H1000000  
    FILE_FLAG_RANDOM_ACCESS = &H10000000  
    FILE_FLAG_SEQUENTIAL_SCAN = &H8000000  
    FILE_FLAG_WRITE_THROUGH = &H80000000  
End Enum  
  
Private Const INVALID_HANDLE_VALUE = -1  
  
'Private Declare Function SetFilePointer Lib "kernel32.dll" (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByRef lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long  
'Private Const INVALID_SET_FILE_POINTER = -1  
'Private Declare Function SetFilePointerEx Lib "kernel32" (ByVal hFile As Long, liDistanceToMove As LARGE_INTEGER, lpNewFilePointer As LARGE_INTEGER, ByVal dwMoveMethod As Long) As Long  
'Private Type LARGE_INTEGER  
'    Lowpart As Long  
'    Highpart As Long  
'End Type  
Private Declare Function SetFilePointerEx Lib "kernel32" (ByVal hFile As Long, ByVal liDistanceToMove As Currency, lpNewFilePointer As Currency, ByVal dwMoveMethod As Long) As Long  
Enum MoveMethod  
    FILE_BEGIN = 0  
    FILE_CURRENT = 1  
    FILE_END = 2  
End Enum  
Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long  
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long  
  
''''''''''''''''''''''''''''''''''''''''''''''''''''  
Private m_Handle As Long  
Private m_FileName As String  
  
Private Sub Class_Initialize()  
    Handle = INVALID_HANDLE_VALUE  
    FileName = ""  
End Sub  
Private Sub Class_Terminate()  
    Call FileClose  
End Sub  
  
'*******properties*******  
Public Property Get Handle() As Long  
    Handle = m_Handle  
End Property  
Private Property Let Handle(ByVal Value As Long)  
    m_Handle = Value  
End Property  
Public Property Get FileName() As String  
    FileName = m_FileName  
End Property  
Private Property Let FileName(ByVal Value As String)  
    m_FileName = Value  
End Property  
'*******public functions*******  
'FileOpen  
'打开文件  
Public Function FileOpen(ByVal FileName As String, ByVal CreateIfNotExists As Boolean) As Boolean  
    Dim dwCreation As Long  
      
    If (CreateIfNotExists) Then  
        dwCreation = OPEN_ALWAYS  
    Else  
        dwCreation = OPEN_EXISTING  
    End If  
      
    If (CreateFile2(FileName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, dwCreation, 0, 0)) Then  
        FileOpen = True  
    Else  
        FileOpen = False  
    End If  
End Function  
'FileSeek  
'移动文件指针  
Public Function FileSeek(ByVal DistanceToMove As Double, ByVal MoveMethod As MoveMethod) As Boolean  
    Dim lRet As Long  
    Dim curIn As Currency, curOut As Currency  
      
    If (Handle = INVALID_HANDLE_VALUE) Then Exit Function  
      
    curIn = dbl2cur(DistanceToMove)  
    lRet = SetFilePointerEx(Handle, curIn, curOut, MoveMethod)  
    If (lRet) Then  
        FileSeek = True  
    Else  
        FileSeek = False  
    End If  
End Function  
'FileWrite  
'写文件  
Public Function FileWrite(Buffer() As Byte) As Boolean  
    Dim lRet As Long  
    Dim lBufferLength As Long  
    Dim lBytesWritten As Long  
      
    If (Handle = INVALID_HANDLE_VALUE) Then Exit Function  
      
    If (IsArrayInit(Buffer()) = False) Then Exit Function  
      
    lBufferLength = UBound(Buffer) - LBound(Buffer) + 1  
    lRet = WriteFile(Handle, Buffer(0), lBufferLength, lBytesWritten, 0)  
    If (lRet And lBytesWritten = lBufferLength) Then  
        'lRet = FlushFileBuffers(Handle)  
        FileWrite = True  
    Else  
        FileWrite = False  
    End If  
End Function  
'FileRead  
'读文件  
Public Function FileRead(Buffer() As Byte) As Boolean  
    Dim lRet As Long  
    Dim lBufferLength  
    Dim lBytesRead As Long  
      
    If (Handle = INVALID_HANDLE_VALUE) Then Exit Function  
      
    If (IsArrayInit(Buffer()) = False) Then Exit Function  
      
    lBufferLength = UBound(Buffer) - LBound(Buffer) + 1  
    lRet = ReadFile(Handle, Buffer(0), lBufferLength, lBytesRead, 0)  
    If (lRet) Then  
        FileRead = True  
    Else  
        FileRead = False  
    End If  
End Function  
'FileClose  
'关闭文件  
Public Function FileClose() As Boolean  
    Dim lRet As Long  
      
    If (Handle = INVALID_HANDLE_VALUE) Then Exit Function  
      
    lRet = CloseHandle(Handle)  
    If (lRet) Then  
        Handle = INVALID_HANDLE_VALUE  
        FileName = ""  
        FileClose = True  
    End If  
End Function  
'CreateFile2  
'创建文件,同 CreateFile API 函数,这个函数可以不暴露  
Public Function CreateFile2(ByVal lpFileName As String, ByVal dwDesiredAccess As DesiredAccess, ByVal dwShareMode As ShareMode, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As CreationDisposition, ByVal dwFlagsAndAttributes As FlagsAndAttributes, ByVal hTemplateFile As Long) As Boolean  
    'The lpFileName string should be //./x: to open a floppy drive x or a partition x on a hard disk.For example:  
    '  
    'String Meaning  
    '//./A: Obtains a handle to drive A on the user's computer.  
    '//./C: Obtains a handle to drive C on the user's computer.  
    m_FileName = lpFileName  
    Handle = CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)  
    CreateFile2 = IIf(Handle <> INVALID_HANDLE_VALUE, True, False)  
End Function  
'FileGetSize  
'取得文件大小(字节)  
Public Function FileGetSize(Size As Double) As Boolean  
    Dim lRet As Long  
    Dim curOut As Currency  
      
    If (Handle = INVALID_HANDLE_VALUE) Then Exit Function  
      
    lRet = GetFileSizeEx(Handle, curOut)  
    If (lRet) Then  
        Size = cur2dbl(curOut)  
        FileGetSize = True  
    End If  
End Function  
'FileSetSize  
'指定文件大小(字节)  
Public Function FileSetSize(ByVal Size As Double) As Boolean  
    Dim lRet As Long  
    Dim curOut As Currency  
      
    If (Size < 0) Then Exit Function  
      
    If (Handle = INVALID_HANDLE_VALUE) Then Exit Function  
      
    lRet = SetFilePointerEx(Handle, dbl2cur(Size), curOut, FILE_BEGIN)  
    If (lRet) Then  
        lRet = SetEndOfFile(Handle)  
        If (lRet) Then  
            FileSetSize = True  
        End If  
    End If  
End Function  
''''''''''''''''''''''''''''''''''''''''''''''''''''  
Private Function cur2dbl(cur As Currency) As Double  
    cur2dbl = cur * 10000  
End Function  
Private Function dbl2cur(dbl As Double) As Currency  
    dbl2cur = dbl / 10000  
End Function  
  
Private Function IsArrayInit(ByRef lpsa() As Byte) As Boolean  
    Dim lRet As Long  
      
    IsArrayInit = True  
      
    Err.Clear  
    On Error Resume Next  
    lRet = LBound(lpsa())  
    If (Err.Number) Then  
        Err.Clear  
        IsArrayInit = False  
    End If  
End Function  
复制代码  
  
  
  
参考链接:http://hi.baidu.com/hnxyy/blog/item/e77c3f87db17612ac65cc3b3.html  
---------------------
作者:dahual
来源:CSDN
原文:https://blog.csdn.net/dahual/article/details/6327998
版权声明:本文为博主原创文章,转载请附上博文链接!

使用API进行文件读写——CreateFile,ReadFile,WriteFile等的更多相关文章

  1. 用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle)完成文件拷贝程序(初级版)

    文件拷贝程序 程序类型:Console 参数:源文件名   目的文件名 要求:1.只能使用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle ...

  2. 使用CreateFile, ReadFile, WriteFile在Windows NT/2000/XP下读写绝对扇区的方法

    也就是在CreateFile的时候打开文件名指定: "\\.\Device"就可以了. 因为代码比较短, 所以我不做注释, 相信大家看代码就能明白意思了. 另外这里读写的都是软盘A ...

  3. MT4调用Windows API进行文件读写操作

    /*导入相关函数*/ #import "kernel32.dll" int CreateDirectoryW(string directoryName,int type); int ...

  4. 关于Windows文件读写_暗涌_新浪博客

    关于Windows文件读写_暗涌_新浪博客     这几天在研究怎么才能加快windows文件读写速度,搜了很多文章,MSDN也看了不少.稍微给大家分享一下.     限制windows文件读写速度的 ...

  5. 【API】文件操作编程基础-CreateFile、WriteFile、SetFilePointer

    1.说明 很多黑客工具的实现是通过对文件进行读写操作的,而文件读写操作实质也是对API函数的调用. 2.相关函数 CreateFile : 创建或打开文件或I/O设备.最常用的I/O设备如下:文件,文 ...

  6. paip.文件读写api php java python总结.txt

    paip.文件读写api php java python总结.txt 一.多种方式读文件内容.    1.按字节读取文件内容   以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. ...

  7. 【iOS】线程安全的文件读写

    前段时间看了一遍GCD(Grand Central Dispatch)多线程,GCD是苹果为多核开发提供的解决方案 多线程最常见的问题就是读写,比如数据库读写,文件读写,读取是共享的,写是互斥,允许多 ...

  8. [js高手之路]node js系列课程-创建简易web服务器与文件读写

    web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3 ...

  9. android菜鸟学习笔记17----Android数据存储(一)文件读写

    假如有如下需求,要求能够记录用户输入的用户名和密码,下次登录时,能直接获取之前保存的用户名密码,并在相应的EditText中显示. 要保存用户输入的数据,最先想到的应该就是文件读写了. 通过对andr ...

随机推荐

  1. springboot整合WebService简单版

    一.什么是webservice 关于webservice的介绍摘自百度百科,上面的介绍很详细.(链接:https://baike.baidu.com/item/Web%20Service/121503 ...

  2. git本地创建多个分支互不干扰

    git本地创建多个分支,互不干扰. 情景:在做某个需求a时,先需要修改紧急bug b:发版时发的是远程dev的代码.   方式一(推荐): (1)本地已有分支dev,写了需求a,先commit,即将工 ...

  3. idea 工具 听课笔记 首页

    maven 创建 javaWeb站点结构标准及异常权限调整 解决Intellij Idea下修改jsp页面不自动更新(链接 idea中使用github  提交 idea 从github.com上恢复站 ...

  4. Eclipse jee最新版国内镜像点下载方式

    Eclipse jee是Eclipse的JavaEE版本,官网服务器在国外,无条件下载的可以使用国内镜像点 清华大学网站镜像网站资料,可用于下载其它版本的Eclipsehttps://mirrors. ...

  5. 使用TableHasPrimaryKey或TableHasForeignKey来知道表是否有主键或外键

    从下面2句SQL语句执行来看, 就知道那一张表有主键PrimaryKey或ForeignKey. 比如,表[Q]和[QQ]既没有主键,也没有外键. 当在SQL语句的条件中,使用“=”,那说明查询出来的 ...

  6. 2020qbxt游记

    csp-s 突破 ----------------------------------------- 1-15 下午才走,这实在是太恶心了.然而因为感冒,当众大佬们都在上学的时候,我在家里睡觉. 2: ...

  7. 剑指offer-面试题49-丑数-空间换时间

    /* 题目: 求从1开始的第n个丑数. */ /* 思路: 按顺序列出各个丑数. */ #include<iostream> #include<cstring> #includ ...

  8. VSCode常用插件之ESLint使用

    更多VSCode插件使用请访问:VSCode常用插件汇总 ESLint这是VS Code ESLint扩展,将ESLint JavaScript集成到VS Code中. 首先简单说一下使用流程: 1. ...

  9. vim 配置 jedi-vim( ubuntu:15.10 )

    确保 vim 支持 python3 或者 python 如果你已经安装了 vim, 可以通过vim --version, 在输出中找到 +python3 或者 +python 字样的话, 就可以跳过该 ...

  10. Docker 下部署hadoop集群

    一.主机规划 3台主机:1个master.2个slaver/worker ip地址使用docker默认的分配地址: master: 主机名: hadoop2.ip地址: 172.17.0.2 slav ...