属性 | 含义 |
FILE_ATTRIBUTE_ARCHIVE
32 (0x20) | 文件为存档未见。程序使用此属性来备份或移除标记文件。当使用 CreateFile 函数创建一个新文件时,会自动设置这个标记 |
FILE_ATTRIBUTE_ENCRYPTED
16384 (0x4000) | 1. 文件或目录被加密。对于文件来说,这意味着文件中所有数据都被加密了;对于目录来说,这意味着加密新创建的文件和子文件夹是默认选项。更多信息,参见 File Encryption
2. 如果指定了 FILE_ATTRIBUTE_SYSTEM 标记位,则这个标记位不起作用
|
FILE_ATTRIBUTE_HIDDEN
2 (0x2) | 文件被隐藏。即在普通文件夹中不被显示 |
FILE_ATTRIBUTE_NORMAL
128 (0x80) | 这个文件不包含其他属性。只有当它单独使用时,这个属性值才是合法的 |
FILE_ATTRIBUTE_OFFLINE
4096 (0x1000) | 文件的数据无法直接访问。这个属性表示文件数据在物理设备中被移动到一个离线存储器。这个属性被远程存储(Remote Storage)—— 即分级存储管理软件 —— 所使用。我们的程序不能随意改变这个属性值 |
FILE_ATTRIBUTE_READONLY
1 (0x1) | 文件只读。程序可以读取文件,但无法写入或删除文件 |
FILE_ATTRIBUTE_SYSTEM
4 (0x4) | 文件是操作系统的的一部分或者专门为操作系统所使用 |
FILE_ATTRIBUTE_TEMPORARY
256 (0x100) | 1. 文件为临时文件
2. 如果拥有足够的缓冲内存,文件系统会避免将数据写入大容量存储器,因为当句柄被关闭后,程序会删除临时文件。否则,在句柄被关闭后,数据会被写回磁盘 |
标志位 | 含义 |
FILE_FLAG_BACKUP_SEMANTICS
(0x02000000) | 1. 此文件已经被打开或者创建以用于备份或者恢复操作。当调用进程拥有 SE_BACKUP_NAME 和 SE_RESTORE_NAME 权限时,系统保证调用进程覆盖文件安全检测。更多信息,参见 Changing Privileges in a Token
2. 若要取一个文件夹句柄,你必须设置这个标记位。某些函数只能接受文件夹句柄而非文件句柄。更多信息,参见 Directory Handles |
FILE_FLAG_DELETE_ON_CLOSE
(0x04000000) | 1. 如果事务仍然处于激活状态,那么在最后指向此文件的事务性写者句柄被关闭后,此文件将马上被删除
2. 如果一个文件有删除标记,且一个事务性写者句柄在事务完成后仍然打开,则文件将不会被删除
3. 如果存在指向某文件的句柄,除非这些句柄都以 FILE_SHARE_DELETE 共享模式打开,否则函数调用失败
4. 后续对此文件的打开操作将会失败,除非指定了 FILE_SHARE_DELETE 共享模式 |
FILE_FLAG_NO_BUFFERING
(0x20000000) | 1. 文件被以不使用系统缓存的方式打开。此标记位不会影响硬盘缓存或内存映射文件。当和标记位 FILE_FLAG_OVERLAPPED 共同使用,此标记位则会有最好的异步操作表现,因为这些 I/O 并不依赖于内存管理器的同步操作。然而,一些 I/O 操作花费更多的时间,因为数据并不保存在缓存中。另一方面,文件的元数据仍然被缓存。若要马上将元数据写入硬盘中,需调用 FlushFileBuffers 函数
2. 当文件被以 FILE_FLAG_NO_BUFFERING 方式打开时,程序必须满足如下要求:
- 文件访问时,文件字节偏移必须是磁盘扇区大小的整数倍
- 文件访问时,读、写的字节数必须时磁盘扇区大小的整数倍。例如,如果扇区大小为512字节,则程序可以申请读取或写入 512,1024,1536 或 2048 字节,但不能是 335,981 或 7171 字节
- 用于读写操作的缓存地址应该与扇区大小对齐,这意味着一个对齐的内存地址必须时磁盘扇区大小的整数倍。在不同磁盘中,此要求可能并不一定是强制的
3. 一个使得缓冲内存对齐的方法是调用 VirtualAlloc 函数去分配缓冲区。此函数分配得到的内存与操作系统内存页大小对齐。因为内存页面和扇区大小都是 2 的幂,且内存页面大小是扇区大小的整数倍。内存页的大小是 4KB 或 8KB;扇区大小在硬盘中是 512B 或 4096B,在 CD 中是 2048B,因此磁盘扇区的大小无论如何都不会大于内存页面大小
4. 程序可以通过调用 GetDiskFreeSpace 函数获取磁盘扇区大小 |
FILE_FLAG_OPEN_NO_RECALL
(0x00100000) | 文件数据被请求,但数据应该继续存放在远程存储器中。文件数据不被传输回本地存储器。此标记位被用于远程存储系统 |
FILE_FLAG_OPEN_REPARSE_POINT
(0x00200000) | 正常的 reparse point 过程将不会发生,CreateFileTransacted 函数将会试图打开 reparse point。当文件被打开,无论控制此 reparse point 的过滤器是否可操作,都会返回文件句柄。此标记位不能与 CREATE_ALWAYS 标记位一起使用。如果此文件不是一个 reparse point,那么此标记位无效 |
FILE_FLAG_OVERLAPPED
(0x40000000) | 1. 此文件被打开或创建用于异步 I/O。当操作完成后,在 OVERLAPPED 结构体中指定的事件会被设置为受信状态。此时在进程中消费大量 CPU 时间的 I/O 操作将会返回 ERROR_IO_PENDING
2. 如果此标记位被指定,文件可同时用于读写操作。系统并不会保留文件指针,因此你必须将文件位置参数传到读写函数的 OVERLAPPED 结构体上,或者更新文件指针
3. 如果此标记位未被指定,那么 I/O 操作不能同时执行,即使我们在调用读写函数时,传入了一个不为 NULL 的 OVERLAPPED 结构体 |
FILE_FLAG_POSIX_SEMANTICS
(0x0100000) | 1. 文件使用 POSIX 规则访问。这包括允许不同的文件使用除了大小写外,其他都相同的文件名
2. 当使用此标记位时要小心,因为使用此标记位创建的文件可能无法被为 MS-DOS 或 16 位 Windows 所编写的程序所访问 |
FILE_FLAG_RANDOM_ACCESS
(0x10000000) | 文件的访问是随机的。系统通过此标记位去优化文件缓存 |
FILE_FLAG_SESSION_AWARE
(0x00800000) | 1. 文件或设备带 session awareness 打开。如果此标记位没有被指定,则 per-session 设备(一个使用 RemoteFX USB 重定向的设备)无法被运行在 session 0 的进程所打开。如果调用进程没有运行在 session 0,则此标记位无效。此标记位只支持在 server 版本的 Windows 系统
2. Windows Server 2008 R2 和 Windows Server 2008:此标记位不支持 Windows Server 2012 之前的版本 |
FILE_FLAG_SEQUENTIAL_SCAN
(0x08000000) | 1. 文件访问的顺序为顺序从文件头访问到文件尾。系统使用此标记位优化文件缓存。如果程序随机移动文件指针访问文件,那么将不会有最好的缓存效果;但是仍然可以保证 I/O 操作正确执行
2. 在程序读取大型文件并且顺序访问时,使用此标记位将会更快速。当程序在读取大型文件,且大部分数据都是顺序读取,只是偶尔跳过少数的字节时,会有更可观的优化效果
3. 当文件系统不支持 I/O 缓存和 FILE_FLAG_NO_BUFFERING 时,此标记位无效
4. 写操作将不会经过任何中间缓存,而是直接写回磁盘 |
FILE_FLAG_WRITE_THROUGH
(0x80000000) | 1. 如果 FILE_FLAG_NO_BUFFERING 标记位没有一起指定,即系统缓存仍在工作,那么数据会写入系统缓存,但接着会马上写入磁盘
2. 如果 FILE_FLAG_NO_BUFFERING 标记位也被指定,即系统缓存不工作,那么数据会绕过系统缓存,直接写入磁盘中 |