• CreateFile() 打开与创建文件


    CreateFile() 函数用以打开和创建文件,函数原型声明如下:

    1 HANDLE WINAPI CreateFile(
    2   __in      LPCTSTR lpFileName,
    3   __in      DWORD dwDesiredAccess,
    4   __in      DWORD dwShareMode,
    5   __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    6   __in      DWORD dwCreationDisposition,
    7   __in      DWORD dwFlagsAndAttributes,
    8   __in_opt  HANDLE hTemplateFile
    9 );

    在 Windows 中,创建和打开文件的 API 都是 CreateFile() 函数,并通过指定不同的参数来表示是创建一个文件,打开已存在的文件,还是重新建立文件等。

    第 1 个参数 lpFileName 是个输入参数,表示操作的对象文件的相对路径或绝对路径。

    第 2 个参数 dwDesiredAccess 是个输入参数,指名对文件对象的操作存取方式,比如是 GENERIC_READ(读文件),GENERIC_WRITE(写文件) 。

    第 3 个参数 dwShareMode 是个输入参数,表示共享模式。指名与其他进程是否共享该文件,可以是共享读(FILE_SHARE_READ),共享写(FILE_SHARE_WRITE),共享删除(FILE_SHARE_DELETE)。如果指名多个属性,那么可用 "|" 将几个属性做或运算。如果本进程需要独占本文件,那么就将该参数设置为 0 。

    第 4 个参数 lpSecurityAttributes  是一个指向 SECURITY_ATTRIBUTES 结构的指针,表示本文件句柄的安全属性,能影响其是否可被子进程继承等操作。如果设为 NULL,则子进程不能继承本句柄。该结构并不常用。

    第 5 个参数 dwCreationDisposition 是个输入参数,表示操作模式。

    第 6 个参数 dwFlagsAndAttributes 是个输入参数,是文件属性和文件标志。

    第 7 个参数 hTemplateFile 是个输入参数,当存取权限包括 GENERIC_WRITE 时,可以设置为一个模板文件的句柄,一般情况下该参数可设为 NULL ,表示不使用模板文件。

    函数的参数选项众多,下面主要列出比较重要且常用的几个进行说明。

    dwShareMode
    0 -- 文件不能共享,且本进程不能在这个文件上打开第 2 个 HANDLE 。
    FILE_SHARE_READ -- 其他进程,包括进行本调用进程,可以打开这个文件并进行并发访问。
    FILE_SHARE_WRITE -- 允许并发写文件。

    lpSecurityAttributes
    该参数指向一个 LPSECURITY_ATTRIBUTES 结构,一般使用中可置为 NULL 。

    dwCreationDisposition
    该参数指定是否创建文件,覆盖现有文件等。选项有以下几个:

    1. CREATE_NEW 
    创建新文件,如果指定的文件已经存在那么失败。

    2. CREATE_ALWAYS 
    创建新文件,如果文件存在则重建该文件,清楚文件内容及文件属性;如果文件不存在,则创建一个个新文件。

    3. OPEN_EXISTING 
    打开现有文件,如果文件不存在则失败。

    4. OPEN_ALWAYS 
    如果文件存在,则打开文件;如果不存在,则创建它,此时等同于 CREATE_NEW。

    5. TRUNCATE_EXISTING 
    将文件长度置为 0.使用该选项时,必须至少指定 GENERIC_WRITE 访问权限,如果文件不存在时则失败,对于已经存在的文件,则该文件的内容会被全部销毁。

    dwFlagsAndAttributes
    该参数指定文件的属性和长度,一共有 32 个标志和属性。属性是文件的特征,且与打开的文件句柄形成对照,如果打开的是现有文件,那么这些标志将被忽略。以下几个是比较常见且重要的属性和标志值。

    1. FILE_ATTRIBUTE_NORMAL 
    该属性只可在不设置其他属性(可以设置标志)时才能使用。

    2. FILE_ATTRIBUTE_READONLY 
    只读文件,应用程序不能写也不能删除文件。

    3. FILE_ATTRIBUTE_ARCHIVE 
    存档文件

    4. FILE_ATTRIBUTE_ENCRYPTED 
    加密文件

    5. FILE_ATTRIBUTE_HIDDEN 
    隐藏文件


    6. FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 
    没有使用内容索引服务


    7. FILE_ATTRIBUTE_OFFLINE 
    离线存储文件

    8. FILE_ATTRIBUTE_SYSTEM 
    系统文件

    9. FILE_ATTRIBUTE_TEMPORARY 
    临时文件

    dwFlagsAndAttributes 

    1.FILE_FLAG_DELETE_ON_CLOSE 
    对临时文件有用,当最后一个打开的句柄被关闭时,Windows 会删除这个文件。

    2.FILE_FLAG_OVERLAPPED 
    以异步 I/O 方式创建可打开文件,这个属性标志对异步 I/O 比较重要。

    3.FILE_FLAG_RANDOM_ACCESS 
    设置该属性标志时,在程序对文件进行随机访问时,Windows 会尝试优化文件缓存。

    4.FILE_FLAG_SEQUENTIAL_SCAN 
    该属性标志表示文件用于顺序访问,Windows 将相应的优化缓存。

    5.FILE_FLAG_BACKUP_SEMANTICS 
    打开和创建文件是为了进行备份和恢复操作。

    6.FILE_FLAG_NO_BUFFERING 
    不使用系统缓存(cahing,不同于硬件缓存)

    5.FILE_FLAG_NO_BUFFERING 
    不使用系统缓存(cahing,不同于硬件缓存)

    7.FILE_FLAG_NO_RECALL 
    远程存储

    8.FILE_FLAG_WRITE_THROUGH 
    存取文件时,对磁盘进行直接操作,不经过缓存

    9.FILE_FLAG_POSIX_SEMANTICS 
    按照 POSIX 规则存取

    10.FILE_FLAG_OPEN_REPARSE_POINT 
    系统将禁止 NTFS 文件系统的“再解析”行为

  • 相关阅读:
    android WebView总结
    Java抓取网页数据(原网页+Javascript返回数据)
    Linux之旅(1): diff, patch和quilt (下)
    浅谈UML的概念和模型之UML九种图
    基于注解的Spring MVC
    Hibernate自增列保存失败的问题
    京东,你玩我?
    MySQL 通配符学习小结
    Java中怎样由枚举常量的ordinal值获得枚举常量对象
    HDU 4588 Count The Carries 计算二进制进位总数
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14731177.html
Copyright © 2020-2023  润新知