使用API进行文件读写——CreateFile,ReadFile,WriteFile等
看了这个帖子:
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等的更多相关文章
- 用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle)完成文件拷贝程序(初级版)
文件拷贝程序 程序类型:Console 参数:源文件名 目的文件名 要求:1.只能使用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle ...
- 使用CreateFile, ReadFile, WriteFile在Windows NT/2000/XP下读写绝对扇区的方法
也就是在CreateFile的时候打开文件名指定: "\\.\Device"就可以了. 因为代码比较短, 所以我不做注释, 相信大家看代码就能明白意思了. 另外这里读写的都是软盘A ...
- MT4调用Windows API进行文件读写操作
/*导入相关函数*/ #import "kernel32.dll" int CreateDirectoryW(string directoryName,int type); int ...
- 关于Windows文件读写_暗涌_新浪博客
关于Windows文件读写_暗涌_新浪博客 这几天在研究怎么才能加快windows文件读写速度,搜了很多文章,MSDN也看了不少.稍微给大家分享一下. 限制windows文件读写速度的 ...
- 【API】文件操作编程基础-CreateFile、WriteFile、SetFilePointer
1.说明 很多黑客工具的实现是通过对文件进行读写操作的,而文件读写操作实质也是对API函数的调用. 2.相关函数 CreateFile : 创建或打开文件或I/O设备.最常用的I/O设备如下:文件,文 ...
- paip.文件读写api php java python总结.txt
paip.文件读写api php java python总结.txt 一.多种方式读文件内容. 1.按字节读取文件内容 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. ...
- 【iOS】线程安全的文件读写
前段时间看了一遍GCD(Grand Central Dispatch)多线程,GCD是苹果为多核开发提供的解决方案 多线程最常见的问题就是读写,比如数据库读写,文件读写,读取是共享的,写是互斥,允许多 ...
- [js高手之路]node js系列课程-创建简易web服务器与文件读写
web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3 ...
- android菜鸟学习笔记17----Android数据存储(一)文件读写
假如有如下需求,要求能够记录用户输入的用户名和密码,下次登录时,能直接获取之前保存的用户名密码,并在相应的EditText中显示. 要保存用户输入的数据,最先想到的应该就是文件读写了. 通过对andr ...
随机推荐
- SpringBoot整合NoSql--(一)Redis
简介: Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.它通常被称为数据结构服务器,因为值(v ...
- 9款最好用的MySQL数据库客户端图形界面管理工具,第三款我用了10年
MySQL的管理维护工具非常多,除了系统自带的命令行管理工具之外,还有许多其他的图形化管理工具,这里我介绍几个经常使用的MySQL图形化管理工具,供大家参考. MySQL是一个非常流行的小型关系型数据 ...
- NAS之NFS/CIFS
NAS之NFS 为集群中的 Web Server 配置后端存储 NFS:Network File System 网络文件系统,Unix系统之间共享文件的一种协议NFS 的客户端主要为Linux支持多节 ...
- 一、JVM之类加载器
一.什么是JVM 先来看下百度百科的解释: JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计 ...
- 请写一个java类,在任何时候都可以向它查询“你已经创建了多少个对象?”
这个问题解决方法很简单,只要设置一个类的静态整型成员(事例中我设置的是n),初始化值为1,然后在其构造函数中添加语句使其+1(n++),这样需要查询创建了多少个对象时直接查询n的值就可以了,如下: p ...
- __PUBLIC__路径设置
在application/config.php的配置文件中开启__PUBLIC__,代码如下: 'view_replace_str'=> '__PUBLIC__'=>'./static' ...
- cf1266D
注意到每一个的点出入流是不会变的,因此本质是让构造一张图满足这个出入流并且边上的流量之和最少,显然流量是平衡的,也就是所有节点的出入流之和为0 因此我们可以直接暴力的选择让负数点向正数点连边,连之后就 ...
- bugkuCTF-管理员系统(IP伪造)
题目地址:http://123.206.31.85:1003/ 登进去是一个管理员后台登录的样子 试了sql的万能密码,发现进不了,而且下面还报错了ip禁止 禁止了我们的ip,但是他本地的ip肯定没有 ...
- sqli-labs11-17(手注+sqlmap)
这几关涉及到的都是post型data处注入,和get型的差别就是注入点的测试处不一样,方法都是一样的 0x01 sqli-labs less-11 1.手工 由于是post型注入,那么我们不能在url ...
- Google Chrome 退出清除浏览数据
版本 79.0.3945.88(正式版本) (64 位) 设置-高级-隐私设置和安全性-网站设置-Cookie和网站数据-退出Chrome时清除Cookie及网站数据.