1 HANDLE CreateFile(
2         PCTSTR    pszName,
3         DWORD    dwDesiredAccess,
4         DWORD    dwShareMode,
5         PSECURITY_ATTRIBUTES    psa,
6         DWORD    dwCreationDisposition,
7         DWORD    dwFlagsAndAttributes,
8         HANDLE    hFileTemplate);

简介:

函数作用:可以用来创建和打开磁盘文件以及其他设备。

返回值:若调用成功,返回句柄值;反之返回INVALID_HANDLE_VALUE(-1),而不是NULL!!

参数详解:

pszName 表示设备的类型,也表示该类设备的某个实例

dwDesiredAccess 指定我们想以何种方式来和设备进行数据传输。

可以传给CreateFile的dwDesiredAccess参数的通用标志
含义
0 我们不希望从设备读取数据或向设备写入数据。如果只想改变设备的配置(比如只是修改文件的时间戳),那么可以传0
GENERIC_READ 允许对设备进行只读访问
GENERIC_WRITE 允许对设备进行只写访问。例如,备份软件会用到这个标志,如果想把数据发送到打印机,也可以使用这个标志。注意,GENERIC_WRITE标志并没有隐式地包含GENERIC_READ标志
GENERIC_READ|GENERIC_WRITE 允许对设备进行读写操作。由于这个标志允许我们和设备之间自由地交换数据,因此也最为常用


 
dwShareMode 用来指定设备共享特权。当我们仍然打开着一个设备的时候,该参数可以控制其他的CreateFile调用,能够以何种方式来打开设备。 

可以传给CreateFile的dwShareMode参数的与I/O相关的标志
含义
0 要求独占对设备的访问。如果设备已经打开,CreateFile调用会失败。如果我们成功地打开了设备,那么后续的CreateFile调用会失败
FILE_SHARE_READ

如果有其他内核对象要使用该设备,我们要求它们不得修改设备的数据。如果设备已经以写入方式或独占方式打开,那么我们的CreateFile调用会失败。如果我们成功地打开了设备,那么后续的使用了GENERIC_WRITE访问标志的CreateFile调用会失败

FILE_SHARE_WRITE 如果有其他内核对象要使用该设备,我们要求它们不得读取设备的数据。如果设备已经以读取方式或独占方式打开,那么我们的CreateFile调用会失败。如果我们成功地打开了设备,那么后续的使用了GENERIC_READ访问标志的CreateFile调用会失败
FILE_SHARE_READ|FILE_SHARE_WRITE 如果有其他内核对象要使用该设备,我们不关心它们会从设备读取数据还是会向设备写入数据。如果设备已经以独占方式打开,那么我们的CreateFile调用会失败。如果我们成功地打开了设备,那么后续的要求独占读取访问、独占写入访问或独占读写访问的CreateFile调用会失败
FILE_SHARE_DELETE 当对文件进行操作的时候,我们不关心文件是否被逻辑删除或是被移动。在Windows内部,系统会先将文件标记为待删除,然后当该文件所有已打开的句柄都被关闭的时候,再将其真正的删除

psa 指向一个SECURITY_ATTRIBUTES结构,可以用来指定安全信息以及我们是否希望CreateFile返回的句柄能够被继承。通常,我们只需要传NULL给psa参数,这表示用默认的安全设定来创建文件,并且返回的句柄是不可继承的。

dwCreationDisposition 

可以传给CreateFile的dwCreationDisposition参数的值
含义
CREATE_NEW 告诉CreateFile创建一个新文件,如果同名文件已经存在,那么CreateFile会调用失败
CREATE_ALWAYS 告诉CreateFile无论同名文件存在与否都创建一个新文件。如果同名文件已经存在,那么CreateFile会覆盖原来的文件
OPEN_EXISTING 告诉CreateFile打开一个已有的文件或设备,如果文件或设备不存在,那么CreateFile会调用失败
OPEN_ALWAYS 告诉CreateFile打开一个已有的文件,如果文件存在,那么CreateFile会直接打开文件,如果文件不存在,那么CreateFile会创建一个新文件
TRUNCATE_EXISTING 告诉CreateFile打开一个已有的文件并将文件的大小截断为0字节,如果文件不存在,那么CreateFile会调用失败

注意:调用CreateFile来打开文件之外的其他设备时,必须将OPEN_EXISTING传给dwCreationDisposition参数

dwFlagsAndAttributes 参数有两个用途:其一,它允许我们设置一些标志来微调与设备之间的通信;其二,如果设备是一个文件,我们还能够设置文件的属性。这些通信标志中的大多数都是一些信号,用来告诉系统我们打算以何种方式来访问设备,这样系统就可以对缓存算法进行优化,来帮助我们提高应用程序的效率。

通信标志:

1. CreateFile的高速缓存标志

FILE_FLAG_NO_BUFFERING 这个标志表示在访问文件的时候不要使用任何数据缓存。

FILE_FLAG_SEQUENTIAL_SCAN 如果指定了这个标志,系统会认为我们将顺序地访问文件。当我们

FILE_FLAG_RANDOM_ACCESS 这个标志告诉系统不要提前读取文件数据

FILE_FLAG_WRITE_THROUGH 这个标志禁止对文件写入操作进行缓存以减少数据丢失的可能性。当我们对文件进行写入操作的时候,系统会将所有对文件的修改直接写入到磁盘中。

2. CreateFile的其他标志

FILE_FLAG_DELETE_ON_CLOSE在文件所有的句柄都关闭后,系统将删除该文件。这个标志通常和FILE_ATTRIBUTE_TEMPORARY属性一起使用。当这两个标志都设置的时候,系统将为应用程序创建临时文件,应用程序可以对其进行读写操作,当关闭文件时,系统将删除文件。

FILE_FLAG_BACKUP_SEMANTICS这个标志一般用于备份和恢复软件。。。。。

FILE_FLAG_POSIX_SEMANTICS

FILE_FLAG_OVERLAPPED 告诉系统我们想要以异步的方式来访问设备

3. 文件属性标志

可以传给CreateFile的dwFlagsAndAttributes参数的值
标志 含义
FILE_ATTRIBUTE_ARCHIVE 文件是一个存档文件。应用程序用这个标志来将文件标记为待备份或待删除。当CreateFile创建一个新文件的时候,会自动设置这个标志
FILE_ATTRIBUTE_ENCRYPTED 文件是经过加密的
FILE_ATTRIBUTE_HIDDEN 文件是隐藏的。它不会出现在通常的目录清单中
FILE_ATTRIBUTE_NORMAL 文件没有其他属性。只有单独使用的时候,这个标志才有效
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 内容索引服务(content indexing service)不会对文件进行索引
FILE_ATTRIBUTE_OFFLINE 文件虽然存在,但文件内容已经被转移到脱机存储器中。这个标志对层级存储系统比较有用
FILE_ATTRIBUTE_READONLY 文件是只读的。应用程序可以读取文件,但不能写入文件或删除文件
FILE_ATTRIBUTE_SYSTEM 文件是操作系统的一部分,或专供操作系统使用
FILE_ATTRIBUTE_TEMPORARY 文件数据只会使用一小段时间。为了将访问时间降至最低,文件系统会尽量将文件数据保存在内存中,而不是保存在磁盘中

hFileTemplate 既可以是标识一个打开的文件的句柄,也可以是NULL。如果标识一个文件句柄,那么CreateFile会完全忽略dwFlagsAndAttributes参数,并转而使用hFileTemplate所标识的文件的属性。注意,hFileTemplate标识的文件必须是一个已经用GENERIC_READ标志打开的文件。如果CreateFile是打开已存在的文件(而不是创建新文件),那么它会忽略hFileTemplate参数。

 

常见错误:

当像pszName传入文档完整路径的时候,斜杠“\”必须用转义字符“\\”代替。

例如:文档路径为D:\myfiles\ReadMe.txt

传入pszName参数的应为TEXT("D:\\myfiles\\ReadMe.txt")