part 10.2 - 文件操作

part 10.2 - 文件操作

标签(空格分隔): win32汇编


1 - windows的文件I/O

  • 打开文件的方式:
    1. 指定包含全路径的文件名,要求操作系统打开文件并返回一个文件句柄
    2. 适应该句柄读写文件,知道关闭为止
  • 读写指针:
    1. 操作系统位每个文件句柄维护一个读写指针
    2. 读写指针总是只想文件下一次要存取的位置,每次对文件的读写操作完成以后,
      读写指针会自动调整到本次操作的最后一个字节后面的位置
  • windows系统I/O扩展:
    1. 除了普通文件,对串口、磁盘设备、网络文件、控制台和目录都可以支持
    2. 支持一部文件操作,文件函数可以不必等待到操作完成才能返回。
    3. 加强对共享、锁定的支持
    4. 文件操作函数和内存映射函数可相互配合
    5. 增加了拷贝文件和移动文件
  • 文件限制:
    1. 文件名长度:255(FAT文件系统不支持)
    2. 文件名组成:除/😗?:<>|

API

  1. 打开和关闭文件

    • CreateFile:打开文件、控制台、通信设备、目录、邮件槽、管道
      • 通过给定文件名打开文件
      • 根据参数决定,文件读写、同步、安全、创建方式、文件属性
      • 最后一个参数可以制定一个文件模板所有参数使用该模板
      • 打开文件成功时返回我呢见句柄,失败返回INVALID_HANDLE_VALUE,通过GetLastError调查原因
    • CloseFile:关闭文件,只有一个参数,即文件名
  2. 移动文件指针

    • SetFilePointer:设置文件指针的位置
      • 当文件被打开的时候,文件指针处于文件的头部
      • 根据给定文件句柄,给定两个32位参数组成的64位偏移量,根据参照移动指针
      • 成功返回新文件指针的位置
      • 可以通过指定偏移量为0来获得文件指针的位置
      • 可以通过移动移动文件指针至所有数据后面的方式扩展文件长度
    • SetEndOfFile:扩展文件长度设置为文件指针所在的长度。
  3. 读写文件:

    • ReadFile:读取文件数据
      • 根据文件句柄,从当前文件指针读取指定的字节数至指定的buffer。
      • 将实际读出的字节数放入参数lpNumberOfBytesRead
      • 最后一个参数制定一个OVERLAPPED结构,用于异步读取,同步取NULL
      • 失败返回0,成功返回非0
    • WriteFile:写入文件数据
      • 参数基本于读相似。
      • WriteFile写文件的时候,写入数据可能被Windows暂时保存在内部的高速缓存中,
        如果写入对象为一个管道,也可能暂时保留在缓冲区逐步发送出去。
    • FlushFileBuffers:强制清空缓冲区,参数只有文件句柄
  4. 文件的共享

    • LockFile:文件锁,防止其他进程对该区域进行读写
      • 锁定两个32位参数组成的64位偏移量指定的开始点和另两个32位参数指定的结束点
      • LockFileEx:可以异步方式执行
      • 文件锁是排他的,一个区域不能重复上锁。
    • UnlockFile:解锁
  5. 查找文件

    • FindFirstFile:查找文件
      • 根据指定路径查找文件,返回WIN32_FIND_DATA_STRUCT结构给第二个参数
      • 路径可以含有通配符
      • 使用FindNextFile 查找其他文件,参数相同。
    • WIN32_FIND_DATA结构:包括文件的相关信息
      • 文件属性
      • 文件时间相关信息
      • 文件名
  6. 文件属性

    • GetFileType:获取文件属性
      • 参数只有文件句柄
      • 返回值:
        1. FILE_TYPE_UBKNOW
        2. FILE_TYPE_DISK
        3. FILE_TYPE_CHAR
        4. FILE_TYPE_PIPE
    • GetFileSize:获取文件长度
      • 根据文件句柄,将文件长度给第二个参数
    • GetFileTime:获取文件的日期
      • 根据文件句柄,返回给后三个参数以文件创建时间、最后读取时间、最后修改时间
      • 返回一个FILETIME结构,两个32成原,组成64位数表示时间
      • 可以使用FileTimeToSystemTime将时间改成SYSTEMTIME类型
      • 同样可以使用SystemTimeToTileTIme将格式改为FILETIME类型
    • SetFileAttributes:根据文件名修改文件属性
    • GetFileAttributes:根据给定的文件名获取文件属性
  7. 其他文件操作

    函数名作用
    CopyFile拷贝文件
    MoveFile移动文件
    DeleteFile删除文件

2 - 驱动器和目录

相关知识:

  • 计算机中可以安装多个物理驱动器
  • 每个物理驱动器可以分为多个主分区和扩展分区
  • 每个主分区就是一个逻辑驱动器,每个扩展分区可以分成多个逻辑驱动器
  • 每个逻辑驱动器可以投个标号卷标
  • 每个驱动器的顶层目录叫做根目录
  • 对于一个进程来说,windows维护一个当前驱动器,并为每个逻辑驱动器维护一个当前路径

API

函数名作用
SetVolumeLabel创建、修改、删除卷标
GetLogincalDrivers返回所有可用的盘符,以标志位的形式
GetLogincalDriveString同上,以字符串形式
GetDriveType检测驱动器类型
GetVolumeInfomation获取更详细的驱动器信息
CreateDirectory创建目录
RemoveDirectory删除目录
GetCurrentDirectory获取当前目录
GetTempPath获取临时目录
GetWindowsDirectory获取windows目录
GetSystemDirectory获取系统目录
SetCurrentDircetory修改当前路径

3 - 内存映射文件

相关知识

  • 内存映射文件的功能
    • 通过内存映射文件函数可以将磁盘上文件的全部或部分映射到进程虚拟地址空间的某一位置
    • 真正对磁盘文件的读写操作由操作系统底层处理,操作系统会使用缓冲
    • windows通过内存映射文件来加载和执行exe和dll文件
    • 多个进程间可以通过该机制来共享数据。不同进程间共享的数据页,将他们提交到虚拟内存的相同页面就可以了。
  • 优点:
    1. 系统对所有的数据传输都是通过4KB大小的数据页实现的,
      每次读入会将要求读取的数据连页读入,效率高
    2. 以标准的内存地址形式来访问文件数据,程序结构从中受益
  • 实现原理:
    • windows中,地址空间中任何一个页面只可能是三种状态:空闲、保留、提交
    • 内存映射文件保留了一个地址空间的区域,根据需要将物理存储器提交给该区域
    • windows位内存映射文件维护计数器,打开内存映射文件对象则加1,关闭减1,0时才真正关闭
  • 虚拟内存与内存映射文件的区别
    1. 虚拟内存实现的基础是分页机制和局部性原理;内存映射文件是再进程地址空间建立磁盘文件部分内容的映射
    2. 虚拟内存使用硬盘只能是页面文件,而内存映射使用的磁盘任何文件
    3. 虚拟内存解决内存大小问题,内存映射文件解决处理大文件、文件读写问题

API

  • 创建内存映射文件 - CreateFileMapping

    • 若提供一以打开的文件的句柄,则根据提供的两个32位单数指定的64位大小以提供的文件名创建内存映射文件,根据参数指定文件的保护类型安全属性
    • 若不提供已打开的文件句柄,指定为-1则在交换空间中建立内存映射文件用于进程间交换数据
  • 打开其他进程创建的内存映射文件 - OpenFileMapping

    • 根据内存映射文件名,以指定的保护类型打开文件
  • 创建内存映射文件视图: - MapViewOfFile

    • 功能:给映射文件内容分配线性地址空间,并将先行地址和文件内容对应起来。
    • 根据给定的映射文件句柄,以指定权限,从给定的64位偏移字节数,返回内存指针
    • 操作系统在映射的时候,并不会将其提交到物理存储器中,只有第一次读写时才会
  • 取消映射文件视图 - UbmapViewOfFIle

    • 参数只有句柄
    • 系统会在试图撤销或映射对象被删除时自动将数据写到磁盘上
  • 强制写入 - FlushViewOfFile

  • 用于读写文件的步骤

    1. CreateFile打开映射文件,获取hFile
    2. CreateFileMapping生成内存映射文件对象,获取hFileMap
    3. MapViewOfFile将文件映射到内存获得lpMemory
    4. 使用改指针读写文件
    5. UnmapViewOfFile接触文件映射,传入lpMemory
    6. CloseHandle关闭内存映射文件,传入hFileMap
    7. CloseHande关闭文件,传入hFile
  • 用于共享数据的步骤

    1. OpenFileMapping打开一个内存映射文件对象,得到hFIleMap
    2. MapViewOfFile映射对象的一个视图,得到loMemory
    3. 同上
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值