part 10.2 - 文件操作
标签(空格分隔): win32汇编
1 - windows的文件I/O
- 打开文件的方式:
- 指定包含全路径的文件名,要求操作系统打开文件并返回一个文件句柄
- 适应该句柄读写文件,知道关闭为止
- 读写指针:
- 操作系统位每个文件句柄维护一个读写指针
- 读写指针总是只想文件下一次要存取的位置,每次对文件的读写操作完成以后,
读写指针会自动调整到本次操作的最后一个字节后面的位置
- windows系统I/O扩展:
- 除了普通文件,对串口、磁盘设备、网络文件、控制台和目录都可以支持
- 支持一部文件操作,文件函数可以不必等待到操作完成才能返回。
- 加强对共享、锁定的支持
- 文件操作函数和内存映射函数可相互配合
- 增加了拷贝文件和移动文件
- 文件限制:
- 文件名长度:255(FAT文件系统不支持)
- 文件名组成:除/😗?:<>|
API
-
打开和关闭文件
CreateFile
:打开文件、控制台、通信设备、目录、邮件槽、管道- 通过给定文件名打开文件
- 根据参数决定,文件读写、同步、安全、创建方式、文件属性
- 最后一个参数可以制定一个文件模板所有参数使用该模板
- 打开文件成功时返回我呢见句柄,失败返回INVALID_HANDLE_VALUE,通过GetLastError调查原因
CloseFile
:关闭文件,只有一个参数,即文件名
-
移动文件指针
SetFilePointer
:设置文件指针的位置- 当文件被打开的时候,文件指针处于文件的头部
- 根据给定文件句柄,给定两个32位参数组成的64位偏移量,根据参照移动指针
- 成功返回新文件指针的位置
- 可以通过指定偏移量为0来获得文件指针的位置
- 可以通过移动移动文件指针至所有数据后面的方式扩展文件长度
SetEndOfFile
:扩展文件长度设置为文件指针所在的长度。
-
读写文件:
ReadFile
:读取文件数据- 根据文件句柄,从当前文件指针读取指定的字节数至指定的buffer。
- 将实际读出的字节数放入参数lpNumberOfBytesRead
- 最后一个参数制定一个
OVERLAPPED
结构,用于异步读取,同步取NULL - 失败返回0,成功返回非0
WriteFile
:写入文件数据- 参数基本于读相似。
- WriteFile写文件的时候,写入数据可能被Windows暂时保存在内部的高速缓存中,
如果写入对象为一个管道,也可能暂时保留在缓冲区逐步发送出去。
FlushFileBuffers
:强制清空缓冲区,参数只有文件句柄
-
文件的共享
LockFile
:文件锁,防止其他进程对该区域进行读写- 锁定两个32位参数组成的64位偏移量指定的开始点和另两个32位参数指定的结束点
- LockFileEx:可以异步方式执行
- 文件锁是排他的,一个区域不能重复上锁。
UnlockFile
:解锁
-
查找文件
FindFirstFile
:查找文件- 根据指定路径查找文件,返回WIN32_FIND_DATA_STRUCT结构给第二个参数
- 路径可以含有通配符
- 使用FindNextFile 查找其他文件,参数相同。
WIN32_FIND_DATA
结构:包括文件的相关信息- 文件属性
- 文件时间相关信息
- 文件名
-
文件属性
GetFileType
:获取文件属性- 参数只有文件句柄
- 返回值:
- FILE_TYPE_UBKNOW
- FILE_TYPE_DISK
- FILE_TYPE_CHAR
- FILE_TYPE_PIPE
GetFileSize
:获取文件长度- 根据文件句柄,将文件长度给第二个参数
GetFileTime
:获取文件的日期- 根据文件句柄,返回给后三个参数以文件创建时间、最后读取时间、最后修改时间
- 返回一个FILETIME结构,两个32成原,组成64位数表示时间
- 可以使用
FileTimeToSystemTime
将时间改成SYSTEMTIME
类型 - 同样可以使用
SystemTimeToTileTIme
将格式改为FILETIME
类型
SetFileAttributes
:根据文件名修改文件属性GetFileAttributes
:根据给定的文件名获取文件属性
-
其他文件操作
函数名 作用 CopyFile 拷贝文件 MoveFile 移动文件 DeleteFile 删除文件
2 - 驱动器和目录
相关知识:
- 计算机中可以安装多个
物理驱动器
- 每个物理驱动器可以分为多个主分区和扩展分区
- 每个主分区就是一个
逻辑驱动器
,每个扩展分区可以分成多个逻辑驱动器 - 每个逻辑驱动器可以投个标号
卷标
- 每个驱动器的顶层目录叫做根目录
对于一个进程来说,windows维护一个当前驱动器,并为每个逻辑驱动器维护一个当前路径
API
函数名 | 作用 |
---|---|
SetVolumeLabel | 创建、修改、删除卷标 |
GetLogincalDrivers | 返回所有可用的盘符,以标志位的形式 |
GetLogincalDriveString | 同上,以字符串形式 |
GetDriveType | 检测驱动器类型 |
GetVolumeInfomation | 获取更详细的驱动器信息 |
CreateDirectory | 创建目录 |
RemoveDirectory | 删除目录 |
GetCurrentDirectory | 获取当前目录 |
GetTempPath | 获取临时目录 |
GetWindowsDirectory | 获取windows目录 |
GetSystemDirectory | 获取系统目录 |
SetCurrentDircetory | 修改当前路径 |
3 - 内存映射文件
相关知识
- 内存映射文件的功能
- 通过内存映射文件函数可以将磁盘上文件的全部或部分映射到进程虚拟地址空间的某一位置
- 真正对磁盘文件的读写操作由操作系统底层处理,操作系统会使用缓冲
- windows通过内存映射文件来加载和执行exe和dll文件
- 多个进程间可以通过该机制来共享数据。不同进程间共享的数据页,将他们提交到虚拟内存的相同页面就可以了。
- 优点:
- 系统对所有的数据传输都是通过
4KB大小的数据页
实现的,
每次读入会将要求读取的数据连页读入,效率高 - 以标准的内存地址形式来访问文件数据,程序结构从中受益
- 系统对所有的数据传输都是通过
- 实现原理:
- windows中,地址空间中任何一个页面只可能是三种状态:
空闲、保留、提交
- 内存映射文件保留了一个地址空间的区域,根据需要将物理存储器提交给该区域
- windows位内存映射文件维护计数器,打开内存映射文件对象则加1,关闭减1,0时才真正关闭
- windows中,地址空间中任何一个页面只可能是三种状态:
- 虚拟内存与内存映射文件的区别
- 虚拟内存实现的基础是分页机制和局部性原理;内存映射文件是再进程地址空间建立磁盘文件部分内容的映射
- 虚拟内存使用硬盘只能是页面文件,而内存映射使用的磁盘任何文件
- 虚拟内存解决内存大小问题,内存映射文件解决处理大文件、文件读写问题
API
-
创建内存映射文件 -
CreateFileMapping
- 若提供一以打开的文件的句柄,则根据提供的两个32位单数指定的64位大小以提供的文件名创建内存映射文件,根据参数指定文件的保护类型、安全属性
- 若不提供已打开的文件句柄,指定为-1则在交换空间中建立内存映射文件用于进程间交换数据
-
打开其他进程创建的内存映射文件 -
OpenFileMapping
- 根据内存映射文件名,以指定的保护类型打开文件
-
创建内存映射文件视图: -
MapViewOfFile
- 功能:给映射文件内容分配线性地址空间,并将先行地址和文件内容对应起来。
- 根据给定的映射文件句柄,以指定权限,从给定的64位偏移和字节数,返回内存指针
- 操作系统在映射的时候,并不会将其提交到物理存储器中,只有第一次读写时才会
-
取消映射文件视图 -
UbmapViewOfFIle
- 参数只有句柄
- 系统会在试图撤销或映射对象被删除时自动将数据写到磁盘上
-
强制写入 -
FlushViewOfFile
-
用于读写文件的步骤
CreateFile
打开映射文件,获取hFileCreateFileMapping
生成内存映射文件对象,获取hFileMapMapViewOfFile
将文件映射到内存获得lpMemory- 使用改指针读写文件
UnmapViewOfFile
接触文件映射,传入lpMemoryCloseHandle
关闭内存映射文件,传入hFileMapCloseHande
关闭文件,传入hFile
-
用于共享数据的步骤
OpenFileMapping
打开一个内存映射文件对象,得到hFIleMapMapViewOfFile
映射对象的一个视图,得到loMemory- 同上