0%

Windows-CreateFile

文件操作

这个文件操作呢其实别叫泛,调用函数的类型其实是许多的,但是最强大的那个呢还是要数CreateFile了。来看一下MSDN的介绍吧:
The CreateFile function creates or opens the following objects and returns a handle that can be used to access the object:

  • files
  • pipes
  • mailslots
  • communications resources
  • disk devices (Windows NT only)
  • consoles
  • directories (open only)

控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
HANDLE CreateFile(
LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// pointer to security attributes
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to
// copy
);

/*下面中文的一个简洁*/
HANDLE CreateFile(LPCTSTR lpFileName, //普通文件名或者设备文件名
DWORD dwDesiredAccess, //访问模式(写/读)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreationDisposition, //如何创建
DWORD dwFlagsAndAttributes, //文件属性
HANDLE hTemplateFile //用于复制文件句柄
);

其实呢,复杂归复杂,但是有一些东西我们可能很少能用到,比如说按个安全属性,基本上用不到。

  1. lpFileName这个参数其实就是类似于路径的一个东西,
    • 文件:文件的名称
    • 串口:COM1为文件名
    • 服务:\.\服务名称(.代表本地机器)
    • 网络上其他主机文件:\主机名\共享目录名\文件名
  2. dwDesiredAccess这个就是文件的打开方式
    • 标准控制权限(16-23位掩码):
    • DELETE 删除对象的权限。
    • READ_CONTROL 从对象的安全描述符中读取信息的权限,但不包括SACL(系统访问控制列表)中的信息。
    • WRITE_DAC 修改对象安全描述符中的DACL(随机访问控制列表)的权限
    • WRITE_OWNER 修改对象安全描述符中的属主的权限
    • SYNCHRONIZE 同步化使用对象的权限,即可以创建一个线程等待信号量释放(但有些对象不支持这个权限)。
    • STANDARD_RIGHTS_REQUIRED 等价于前面四种权限的总合(通常这四种是必须具有的权限)。
    • STANDARD_RIGHTS_READ 一般等价于READ_CONTROL
    • STANDARD_RIGHTS_WRITE 一般等价于READ_CONTROL
    • STANDARD_RIGHTS_EXECUTE 一般等价于READ_CONTROL
    • STANDARD_RIGHTS_ALL 等价于前面五种权限的总合。
    • 特殊控制权限(0-15位掩码):
    • SPECIFIC_RIGHTS_ALL
    • ACCESS_SYSTEM_SECURITY
    • MAXIMUM_ALLOWED
    • GENERIC_READ
    • GENERIC_WRITE
    • GENERIC_EXECUTE
    • GENERIC_ALL
    • 注:实质上是通过ACCESS_MASK结构体的一个双字值来设置标准权限、特殊权限和一般权限的。
  3. dwShareMode这个参数就是共享的方式,百度上的解释:
    • 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示随后打开操作对象会成功,但只有删除访问请求的权限;如果是FILE_SHARE_READ随后打开操作对象会成功只有请求读访问的权限;如果是FILE_SHARE_WRITE 随后打开操作对象会成功,但只有请求写访问的权限。
  4. lpSecurityAttributes这个参数就是一个指向安全属性的一个指针,这个有点乱,我一般就填写NULL,这个就是默认。
  5. dwCreationDisposition这个参数文件的状态,主要是下面这几个常量:
    • CREATE_NEW 创建文件;如文件存在则会出错
    • CREATE_ALWAYS 创建文件,会改写前一个文件
    • OPEN_EXISTING 文件必须已经存在。由设备提出要求
    • OPEN_ALWAYS 如文件不存在则创建它
    • TRUNCATE_EXISTING 将现有文件缩短为零长度
  6. dwFlagsAndAttributes这个参数新建文件的属性和标志,也就是下面几个常量:
    FILE_ATTRIBUTE_ARCHIVE 标记归档属性
    FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
    • FILE_ATTRIBUTE_NORMAL 默认属性
    • FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录
    • FILE_ATTRIBUTE_READONLY 文件为只读
    • FILE_ATTRIBUTE_SYSTEM 文件为系统文件
    • FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作
    • FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
    • FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
    • FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化
    • FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化
    • FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
  7. hTemplateFile是个文件的模板,这个参数好像已经废掉了,写个NULL就可以了。

返回值的话呢,就是一个文件的句柄,接受之后就可以对其操作了,也不只是文件句柄,很多的东西呢,之后再说。

实际操作

为了方便起见,我就拿简单的读写文件进行演示吧,其他的都是放在后面说:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
HANDLE hFile;
hFile = CreateFile("Wker.txt",
GENERIC_WRITE,//要写这个文件
0,//不共享
NULL,//默认的安全属性
CREATE_ALWAYS,//创建文件
FILE_ATTRIBUTE_NORMAL,//普通文件
NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
cout<<"打开失败,看看是不是有杀毒软件哦!"<<endl;
return -1;
}
//操作文件指针
return 0;
}

代码简单易懂,看下就好了。