各位读者朋友都因该知道所谓C++文件操作,就是利用文件处理对象(如ifstream,ofstream,fstream)对磁盘文件进行操作。到了MFC,文件操作就从fstream转到了CFile对象。总而言之,C++文件体系一个封装一个。C++面向对象三要素就有封装性。Windows标准库一堆函数,逻辑整理都来不起,所以出现了fstream,但fstream和CObject没有半毛钱关系,所以有了CFile。
现在,我们从Windows标准库中一步步把封装时漏掉的函数找回来。
1 CreateFile 函数
WINBASEAPI
HANDLE
WINAPI
CreateFileW(
_In_ LPCWSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
这个函数显而易见,就是创建一个文件,可竟然有这么多参数!
1 lpFileName 要创建或打开的文件或设备的名称
2 dwDesiredAccess 请求对文件或设备的访问权限,最常用的值是 GENERIC_READ、 GENERIC_WRITE或两者 (GENERIC_READ | GENERIC_WRITE
) 。 详细信息请参阅 通用访问权限、 文件安全性和访问权限、 文件访问权限常量。
3 dwShareMode 请求的文件或设备的共享模式,可以是读取、写入、删除
4 lpSecurityAttributes 指向 SECURITY_ATTRIBUTES 结构的指针,此参数可以为 NULL。
//SECURITY_ATTRIBUTES struct
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
5 dwCreationDisposition 要对存在或不存在的文件或设备执行的操作。
对于文件以外的设备,此参数通常设置为 OPEN_EXISTING。
此参数必须是以下值之一(这些值不能组合):
6 dwFlagsAndAttributes 文件或设备属性和标志 ,FILE_ATTRIBUTE_NORMAL 是文件最常见的默认值。此参数可以包含可用文件属性的任意组合 (FILE_ATTRIBUTE_*) 。 所有其他文件属性都替代 FILE_ATTRIBUTE_NORMAL。
有关对文件属性的更高级访问,请参阅 SetFileAttributes。 有关所有文件属性及其值和说明的完整列表,请参阅 文件属性常量。
Attribute | 含义 |
---|---|
FILE_ATTRIBUTE_ARCHIVE 32 (0x20) | 应存档该文件。 应用程序使用此属性来标记要备份或删除的文件。 |
FILE_ATTRIBUTE_ENCRYPTED 16384 (0x4000) | 此文件或目录已加密。 对于文件来说,表示文件中的所有数据都是加密的。 对于目录,这意味着加密是新创建的文件和子目录的默认设置。 有关详细信息,请参阅 文件加密。 如果还指定 了FILE_ATTRIBUTE_SYSTEM ,则此标志不起作用。 家庭版、家庭高级版、入门版或 ARM 版本的 Windows 不支持此标志。 |
FILE_ATTRIBUTE_HIDDEN 2 (0x2) | 文件被隐藏。 不要将其包含在普通目录列表中。 |
FILE_ATTRIBUTE_NORMAL 128 (0x80) | 文件未设置其他属性。 此属性仅在单独使用时有效。 |
FILE_ATTRIBUTE_OFFLINE 4096 (0x1000) | 文件的数据不会立即可用。 此属性指示文件数据以物理方式移动到脱机存储。 此属性由远程存储(分层存储管理软件)使用。 应用程序不应随意更改此属性。 |
FILE_ATTRIBUTE_READONLY 1 (0x1) | 文件为只读文件。 应用程序可以读取文件,但不能写入或删除它。 |
FILE_ATTRIBUTE_SYSTEM 4 (0x4) | 该文件是操作系统的一部分,或者由操作系统独占使用。 |
FILE_ATTRIBUTE_TEMPORARY 256 (0x100) | 该文件用于临时存储。 有关详细信息,请参阅本主题的 缓存行为 部分。 |
标志 | 含义 |
---|---|
FILE_FLAG_BACKUP_SEMANTICS 0x02000000 | 正在为备份或还原操作打开或创建文件。 当进程具有 SE_BACKUP_NAME 和 SE_RESTORE_NAME 特权时,系统会确保调用进程替代文件安全检查。 有关详细信息,请参阅 更改令牌中的权限。 必须设置此标志才能获取目录的句柄。 目录句柄可以传递给某些函数,而不是文件句柄。 有关详细信息,请参见“备注”部分。 |
FILE_FLAG_DELETE_ON_CLOSE 0x04000000 | 文件在其所有句柄都关闭后立即被删除,其中包括指定的句柄和任何其他打开或重复的句柄。 如果存在文件的现有打开句柄,则调用会失败,除非它们都以 FILE_SHARE_DELETE 共享模式打开。 针对文件的后续打开请求将失败,除非指定 FILE_SHARE_DELETE 共享模式。 |
FILE_FLAG_NO_BUFFERING 0x20000000 | 正在打开文件或设备,没有系统缓存数据读取和写入。 此标志不会影响硬盘缓存或内存映射文件。 使用 FILE_FLAG_NO_BUFFERING 标志成功处理使用 CreateFile 打开的文件有严格的要求,有关详细信息,请参阅文件缓冲。 |
FILE_FLAG_OPEN_NO_RECALL 0x00100000 | 请求文件数据,但它应继续位于远程存储中。 不应将其传输回本地存储。 此标志供远程存储系统使用。 |
FILE_FLAG_OPEN_REPARSE_POINT 0x00200000 | 正常的 重分析点 处理不会发生; CreateFile 将尝试打开重新分析点。 打开文件时,无论控制重分析点的筛选器是否正常运行,都返回文件句柄。 此标志不能与 CREATE_ALWAYS 标志一起使用。 如果文件不是重分析点,则忽略此标志。 有关详细信息,请参见“备注”部分。 |
FILE_FLAG_OVERLAPPED 0x40000000 | 正在为异步 I/O 打开或创建文件或设备。 在此句柄上完成后续 I/O 操作时, 在 OVERLAPPED 结构中指定的事件将设置为信号状态。 如果指定了此标志,则文件可用于同时读取和写入操作。 如果未指定此标志,则 I/O 操作将序列化,即使对读取和写入函数的调用指定 了 OVERLAPPED 结构也是如此。 有关使用此标志创建的文件句柄时的注意事项的信息,请参阅本主题的 同步和异步 I/O 句柄 部分。 |
FILE_FLAG_POSIX_SEMANTICS 0x01000000 | 将根据 POSIX 规则进行访问。 这包括允许多个具有名称的文件(仅针对支持该命名的文件系统)有所不同。 使用此选项时请小心,因为为 MS-DOS 或 16 位 Windows 编写的应用程序可能无法访问使用此标志创建的文件。 |
FILE_FLAG_RANDOM_ACCESS 0x10000000 | 访问应是随机的。 系统可将此选项用作优化文件缓存的提示。 如果文件系统不支持缓存的 I/O 和 FILE_FLAG_NO_BUFFERING,则此标志不起作用。 有关详细信息,请参阅本主题的 缓存行为 部分。 |
FILE_FLAG_SESSION_AWARE 0x00800000 | 正在使用会话感知打开文件或设备。 如果未指定此标志,则会话 0 中运行的进程无法打开每个会话 (设备,例如使用 RemoteFX USB 重定向) 的设备。 此标志对不在会话 0 中的调用方无效。 此标志仅在服务器版本的 Windows 上受支持。 Windows Server 2008 R2 和 Windows Server 2008: 在Windows Server 2012之前,不支持此标志。 |
FILE_FLAG_SEQUENTIAL_SCAN 0x08000000 | 访问旨在从头到尾按顺序进行。 系统可将此选项用作优化文件缓存的提示。 如果读取隐藏 (即使用反向扫描) ,则不应使用此标志。 如果文件系统不支持缓存的 I/O 且 FILE_FLAG_NO_BUFFERING,则此标志无效。 有关详细信息,请参阅本主题的 缓存行为 部分。 |
FILE_FLAG_WRITE_THROUGH 0x80000000 | 写入操作不会通过任何中间缓存,它们将直接转到磁盘。 有关其他信息,请参阅本主题的 缓存行为 部分。 |
dwFlagsAndAttributes 参数还可以指定 SQOS 信息。 有关详细信息,请参阅 模拟级别。 当调用应用程序将 SECURITY_SQOS_PRESENT 标志指定为 dwFlagsAndAttributes 的一部分时,它还可以包含以下一个或多个值。
7 hTemplateFile 具有 GENERIC_READ 访问权限的模板文件的有效句柄。 模板文件为正在创建的文件提供文件属性和扩展属性。此参数可以为 NULL。
2 DeleteFile 函数
WINBASEAPI
BOOL
WINAPI
DeleteFileW(
_In_ LPCWSTR lpFileName
);
1 lpFileName 删除文件的路径及名称
3 GetFileSizeEx 函数
WINBASEAPI
DWORD
WINAPI
GetFileSize(
_In_ HANDLE hFile,
_Out_opt_ LPDWORD lpFileSizeHigh
);
1 hFile 文件的句柄。 必须使用 FILE_READ_ATTRIBUTES 访问权限或等效项创建句柄,或者调用方必须对包含文件的目录具有足够的权限。 有关详细信息,请参阅 文件安全和访问权限。
2 lpFileSizeHigh 指向接收文件大小(以字节为单位 )
// LARGE_INTEGER union
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
} DUMMYSTRUCTNAME;
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart;
} LARGE_INTEGER;
4 FindFile 系列函数
5 读写系列函数
本期分享到此结束,请继续关注C++ 文件进阶操作(二)!