CreateFile

【勇芳软件工作室】汉化HomePreviousNext

CreateFile函数创建或打开以下对象并返回可用于访问对象的句柄:

*文件

*管道

*邮筒

*通讯资源

*磁盘设备(仅限Windows NT)

*游戏机

*目录(仅打开)

手柄CreateFile(

LPCTSTR 【lpFileName】,//指向文件名的指针
DWORD 【dwDesiredAccess】,//访问(读写)模式
DWORD 【dwShareMode】,//共享模式
LPSECURITY_ATTRIBUTES 【lpSecurityAttributes】,//指向安全属性的指针
DWORD 【dwCreationDistribution】,//如何创建
DWORD 【dwFlagsAndAttributes】,//文件属性
HANDLE 【hTemplateFile】//处理要复制的属性的文件
); 

参数

【lpFileName】

指向一个以null结尾的字符串,指定要创建或打开的对象(文件,管道,邮槽,通信资源,磁盘设备,控制台或目录)的名称。

如果* 【lpFileName】是路径,则默认字符串大小限制为MAX_PATH个字符。此限制与CreateFile功能如何解析路径有关。

Windows NT:您可以通过调用宽(W)版本CreateFile并在路径前面加上“\\\\?\\”,使用长于MAX_PATH字符的路径。“\\\\?\\”告诉功能关闭路径解析。这样可以使用长达近32,000个Unicode字符的路径。您必须使用这种技术的完全限定路径。这也适用于UNC名称。“\\\\?\\”作为路径的一部分被忽略。例如,“\\\\?\\ C:\\ myworld \\ private”被视为“C:\\ myworld \\ private”,“\\\\?\\ UNC \\ tom_1 \\ hotstuff \\ coolapps”被视为“\\\\ tom_1 \\ hotstuff \\ coolapps”。

【dwDesiredAccess】

指定对象的访问类型。应用程序可以获取读取访问权限,写访问权限,读写访问权限或设备查询访问权限。该参数可以是以下值的任意组合。

含义
0指定对象的设备查询访问。应用程序可以在不访问设备的情况下查询设备属性。
GENERIC_READ指定对对象的读访问。可以从文件读取数据,文件指针可以移动。结合GENERIC_WRITE进行读写访问。
GENERIC_WRITE指定对对象的写访问。数据可以写入文件,文件指针可以移动。结合GENERIC_READ进行读写访问。

【dwShareMode】

一组位标志,指定对象如何共享。如果【dwShareMode】为0,则无法共享该对象。对对象的后续打开操作将失败,直到手柄关闭。

要共享对象,请使用以下一个或多个值的组合:

含义
FILE_SHARE_DELETE仅Windows NT:对对象的后续打开操作只有在请求删除访问时才会成功。
FILE_SHARE_READ对对象的后续打开操作只有在请求读访问时才能成功。
FILE_SHARE_WRITE对对象的后续打开操作只有在请求写访问时才能成功。

【lpSecurityAttributes】

指向SECURITY_ATTRIBUTES结构的指针,用于确定返回的句柄是否可由子进程继承。如果【lpSecurityAttributes】为NULL,则无法继承该句柄。

Windows NT:结构的lpSecurityDescriptor成员指定对象的安全描述符。如果【lpSecurityAttributes】为NULL,则该对象将获取默认安全描述符。目标文件系统必须支持该参数的文件和目录的安全性,以对文件产生影响。

Windows 95:结构的lpSecurityDescriptor成员将被忽略。

【dwCreationDistribution】

指定对存在的文件采取的操作以及文件不存在时要执行的操作。有关此参数的详细信息,请参阅备注部分。此参数必须是以下值之一:

含义
CREATE_NEW创建一个新文件。如果指定的文件已经存在,该函数将失败。
CREATE_ALWAYS创建一个新文件。该函数覆盖该文件(如果存在)。
OPEN_EXISTING打开文件。如果文件不存在,该函数将失败。
 有关如何为设备(包括控制台)使用CreateFile功能的OPEN_EXISTING标志的讨论,请参阅备注部分。
OPEN_ALWAYS打开文件(如果存在)。如果该文件不存在,该函数将创建该文件,就像【dwCreationDistribution】为CREATE_NEW一样。
TRUNCATE_EXISTING打开文件。一旦打开,文件被截断,使其大小为零字节。调用进程必须至少打开GENERIC_WRITE访问的文件。如果文件不存在,该函数将失败。

【dwFlagsAndAttributes】

指定文件的文件属性和标志。

以下属性的任何组合都是可以接受的,除了所有其他文件属性都覆盖FILE_ATTRIBUTE_NORMAL。

属性含义
FILE_ATTRIBUTE_ARCHIVE文件应该存档。应用程序使用此属性来标记文件进行备份或删除。
FILE_ATTRIBUTE_COMPRESSED文件或目录被压缩。对于一个文件,这意味着文件中的所有数据都被压缩。对于目录,这意味着压缩是新创建的文件和子目录的默认压缩。
FILE_ATTRIBUTE_HIDDEN该文件被隐藏。它不包括在普通目录列表中。
FILE_ATTRIBUTE_NORMAL该文件没有设置其他属性。此属性仅在单独使用时有效。
FILE_ATTRIBUTE_OFFLINE该文件的数据不能立即可用。表示文件数据已被物理移动到离线存储。
FILE_ATTRIBUTE_READONLY该文件是只读的。应用程序可以读取文件,但无法写入或删除它。
FILE_ATTRIBUTE_SYSTEM该文件是操作系统的一部分或专门用于操作系统。
FILE_ATTRIBUTE_TEMPORARY该文件正在用于临时存储。文件系统尝试将所有数据保存在内存中,以便更快地访问数据,而不是将数据刷新回大容量存储。一旦临时文件不再需要,应由应用程序删除。

以下标志的任意组合都可以接受。

含义
FILE_FLAG_WRITE_THROUGH 
 指示操作系统通过任何中间缓存进行写入,直接转到磁盘。操作系统仍然可以缓存写入操作,但不能懒惰地刷新它们。
FILE_FLAG_OVERLAPPED 
 指示操作系统初始化对象,因此ReadFileWriteFileConnectNamedPipeTransactNamedPipe操作需要大量时间来处理返回ERROR_IO_PENDING。当操作完成时,事件被设置为信号状态。
 当您指定FILE_FLAG_OVERLAPPED时,WriteFileWriteFile函数【必须】指定OVERLAPPED结构。也就是说,当指定FILE_FLAG_OVERLAPPED时,应用程序【必须】执行重叠的读写操作。
 当指定FILE_FLAG_OVERLAPPED时,操作系统不保留文件指针。文件位置必须作为【lpOverlapped的】参数(指向OVERLAPPED结构)的一部分传递给ReadFileWriteFile函数。
 该标志还使得能够与句柄同时执行多个操作(例如同时的读取和写入操作)。
FILE_FLAG_NO_BUFFERING 
 指示操作系统打开没有中间缓冲或缓存的文件。这在某些情况下可以提供性能提升。

使用FILE_FLAG_NO_BUFFERING打开的文件时,应用程序必须满足某些要求:

*文件访问必须以文件中的字节偏移量开始,它是卷扇区大小的整数倍。

*文件访问必须是与卷扇区大小整数倍的字节数。例如,如果扇区大小为512字节,则应用程序可以请求512,1024或2048字节的读取和写入,但不要求335,981或7171字节的读取和写入。

*读和写操作的缓冲区地址必须对齐在存储器中的地址,该地址是卷扇区大小的整数倍。

将缓冲区对齐于卷扇区大小的整数倍的一种方法是使用VirtualAlloc分配缓冲区。它分配在操作系统内存页大小的整数倍的地址上对齐的内存。由于存储器页面和卷扇区大小都是2的幂,所以该存储器也对应于卷扇区大小的整数倍的地址。

应用程序可以通过调用GetDiskFreeSpace功能来确定卷的扇区大小。

FILE_FLAG_RANDOM_ACCESS 
 表示文件被随机访问。Windows可以使用此作为优化文件缓存的提示。
FILE_FLAG_SEQUENTIAL_SCAN 
 表示要从头到尾依次访问该文件。Windows可以使用此作为优化文件缓存的提示。如果应用程序移动文件指针进行随机访问,则可能不会发生最佳缓存;然而,正确的操作仍然得到保证。
 指定此标志可以提高使用顺序访问读取大文件的应用程序的性能。对于大多数顺序读取大文件的应用程序,性能提升可能更为显着,但偶尔会跳过小范围的字节。
FILE_FLAG_DELETE_ON_CLOSE 
 表示操作系统在其所有句柄关闭后立即删除文件,而不仅仅是您指定的句柄FILE_FLAG_DELETE_ON_CLOSE。

对文件的后续打开请求将失败,除非使用FILE_SHARE_DELETE。

FILE_FLAG_BACKUP_SEMANTICS 
 仅Windows NT:表示正在为备份或还原操作打开或创建该文件。操作系统确保调用进程将覆盖文件安全性检查,前提是它具有必要的权限。相关权限是SE_BACKUP_NAME和SE_RESTORE_NAME。

您还可以设置此标志来获取目录的句柄。一个目录句柄可以传递给一些Win32函数来代替一个文件句柄。

FILE_FLAG_POSIX_SEMANTICS 
 表示要根据POSIX规则访问该文件。这包括允许具有名称的多个文件,在不同的情况下,对于支持这样命名的文件系统。使用此选项时请小心,因为使用此标志创建的文件可能无法由为MS-DOS,Windows或Windows NT编写的应用程序访问。

如果CreateFile功能打开命名管道的客户端,则【dwFlagsAndAttributes】参数还可以包含安全服务质量信息。当调用应用程序指定SECURITY_SQOS_PRESENT标志时,【dwFlagsAndAttributes】参数可以包含一个或多个以下值:

含义
SECURITY_ANONYMOUS指定在匿名模拟级别模拟客户端。
SECURITY_IDENTIFICATION指定在“身份验证”模拟级别模拟客户端。
SECURITY_IMPERSONATION指定在模拟模拟级别模拟客户端。
SECURITY_DELEGATION指定在代理模拟级别模拟客户端。
SECURITY_CONTEXT_TRACKING指定安全跟踪模式是动态的。如果未指定此标志,安全跟踪模式是静态的。
SECURITY_EFFECTIVE_ONLY指定只有客户端的安全上下文的已启用方面可用于服务器。如果您不指定此标志,客户端的安全上下文的所有方面都可用。

此标志允许客户端限制服务器在模拟客户端时可以使用的组和权限。


有关详细信息,请参阅安全.

【hTemplateFile】

指定具有GENERIC_READ访问模板文件的句柄。模板文件提供正在创建的文件的文件属性和扩展属性。

Windows 95:此值必须为NULL。如果您在Windows 95下提供句柄,则调用失败,GetLastError返回ERROR_NOT_SUPPORTED。

返回值

如果函数成功,则返回值是指定文件的打开句柄。如果在函数调用之前存在指定的文件,并且【dwCreationDistribution】是CREATE_ALWAYS或OPEN_ALWAYS,则调用GetLastError将返回ERROR_ALREADY_EXISTS(即使该函数已成功)。如果该文件在调用之前不存在,则GetLastError返回零。

如果函数失败,返回值为INVALID_HANDLE_VALUE。要获取扩展错误信息,请调用GetLastError.

备注

使用CloseHandle函数来关闭CreateFile返回的对象句柄。

如上所述,为【dwDesiredAccess】指定零,允许应用程序查询设备属性,而无需实际访问设备。这种类型的查询是有用的,例如,如果应用程序想要确定软盘驱动器的大小以及它在驱动器中没有软盘所支持的格式。

创建新文件时,CreateFile功能将执行以下操作:

*将文件属性和由【dwFlagsAndAttributes】指定的标志与FILE_ATTRIBUTE_ARCHIVE组合。

*将文件长度设置为零。

*如果指定了【hTemplateFile】参数,则将模板文件提供的扩展属性复制到新文件。

打开现有文件时,CreateFile将执行以下操作:

*将【dwFlagsAndAttributes】指定的文件标识与现有文件属性组合。CreateFile忽略【dwFlagsAndAttributes】指定的文件属性。

*根据【dwCreationDistribution】的值设置文件长度。

*忽略【hTemplateFile】参数。

*如果【lpSecurityAttributes】参数不为NULL,则忽略SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员。使用其他结构构件。bInheritHandle成员是指示文件句柄是否可以继承的唯一方法。

如果您尝试在没有软盘或没有CD的CD-ROM驱动器的软盘驱动器上创建文件,系统会显示一个消息框,要求用户分别插入磁盘或CD 。要防止系统显示此消息框,请使用SEM_FAILCRITICALERRORS调用SetErrorMode函数。

管道

如果CreateFile打开命名管道的客户端,该函数将使用处于侦听状态的命名管道的任何实例。打开过程可以根据需要复制句柄多次,但是一旦打开,命名管道实例就不能被另一个客户端打开。管道打开时指定的访问必须与CreateNamedPipe功能的【dwOpenMode】参数中指定的访问兼容。有关管道的更多信息,请参阅管道.

邮筒

如果CreateFile打开邮槽的客户端,则如果邮槽服务器使用CreateMailSlot功能创建邮件服务器之前邮件客户端尝试打开本地邮槽,该函数将返回INVALID_HANDLE_VALUE。有关邮槽的更多信息,请参阅邮筒.

通信资源

CreateFile功能可以创建一个通信资源的句柄,例如串口COM1。对于通信资源,【dwCreationDistribution】参数必须为OPEN_EXISTING,并且【hTemplate】参数必须为NULL。可以指定读,写或读 - 写访问,并且可以为重叠的I / O打开句柄。有关通信的更多信息,请参阅通讯.

磁盘设备

Windows NT:您可以使用CreateFile功能打开磁盘驱动器或磁盘驱动器上的分区。该函数返回到磁盘设备的句柄;该句柄可以与DeviceIOControl函数一起使用。必须符合以下要求才能使此呼叫成功:

*呼叫者必须具有管理权限才能使硬盘驱动器上的操作成功。

* 【lpFileName】字符串的格式应为\\.\PHYSICALDRIVE【x】以打开硬盘【x】.硬盘编号从零开始。例如:

含义
\\.\PHYSICALDRIVE2获取用户计算机上第三个物理驱动器的句柄。

* 【lpFileName】字符串应为\\.\【x】:以在硬盘上打开软盘驱动器【x】或分区【x】.例如:

含义
\\.\A:在用户的电脑上获取驱动器A的句柄。
\\.\C:获得一个句柄来驱动用户计算机上的C。

Windows 95:这种技术无法打开逻辑驱动器。在Windows 95中,指定此表单中的字符串将导致CreateFile返回错误。

* 【dwCreationDistribution】参数必须具有OPEN_EXISTING值。

*打开硬盘上的软盘或分区时,必须在【dwShareMode】参数中设置FILE_SHARE_WRITE标志。

控制台

CreateFile功能可以创建控制台输入(CONIN $)的句柄。如果进程由于继承或复制而具有打开的句柄,那么它也可以创建一个主动屏幕缓冲区(CONOUT $)的句柄。调用进程必须附加到继承的控制台或由AllocConsole函数分配的控制台。对于控制台手柄,请按如下所示设置CreateFile参数:

参数
【lpFileName】使用CONIN $值指定控制台输入和CONOUT $值来指定控制台输出。
 CONIN $获得控制台输入缓冲区的句柄,即使SetStdHandle函数重定向到标准输入句柄。要获取标准输入句柄,请使用GetStdHandle功能。
 CONOUT $获得活动屏幕缓冲区的句柄,即使SetStdHandle重定向了标准输出句柄。要获取标准输出句柄,请使用GetStdHandle.
【dwDesiredAccess】GENERIC_READ | GENERIC_WRITE是首选,但可以限制访问。
【dwShareMode】如果调用进程继承控制台,或者子进程应该能够访问控制台,则此参数必须为FILE_SHARE_READ | FILE_SHARE_WRITE。
【lpSecurityAttributes】如果您希望继承控制台,则SECURITY_ATTRIBUTES结构中的bInheritHandle成员必须为TRUE。
【dwCreationDistribution】使用CreateFile打开控制台时,应指定OPEN_EXISTING。
【dwFlagsAndAttributes】忽略。
【hTemplateFile】忽略。

以下列表显示【fwdAccessel-Latn】【lpFileName】的各种设置的效果。

【lpFileName】【fwdAccessel-Latn】结果
CONGENERIC_READ打开控制台进行输入。
CONGENERIC_WRITE打开控制台输出。
CONGENERIC_READ\
GENERIC_WRITE
Windows 95:导致CreateFile失败; GetLastError返回ERROR_PATH_NOT_FOUND。

Windows NT:导致CreateFile失败; GetLastError返回ERROR_FILE_NOT_FOUND。


目录

应用程序无法使用CreateFile创建目录;它必须调用CreateDirectoryCreateDirectoryEx来创建一个目录。

Windows NT:

您可以通过设置FILE_FLAG_BACKUP_SEMANTICS标志获取句柄到一个目录。一个目录句柄可以传递给一些Win32函数来代替一个文件句柄。

某些文件系统(如NTFS)支持单个文件和目录的压缩。在为这样的文件系统格式化的卷上,新的目录继承其父目录的压缩属性。

也可以看看

AllocConsole, CloseHandle, ConnectNamedPipe, CreateDirectory,CreateDirectoryEx,CreateNamedPipe, DeviceIOControl, GetDiskFreeSpace, GetOverlappedResult, GetStdHandle, OpenFile, OVERLAPPED, ReadFile, SECURITY_ATTRIBUTES, SetErrorMode, SetStdHandle TransactNamedPipe, VirtualAlloc, WriteFile