新建目录。 如果基础文件系统支持文件和目录的安全性,该函数会将指定的安全描述符应用于新目录。
若要指定模板目录,请使用 CreateDirectoryEx 函数。
若要将此作作为事务处理作执行,请使用 CreateDirectoryTransacted 函数。
语法
HANDLE CreateDirectory2A(
LPCSTR lpPathName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
DIRECTORY_FLAGS DirectoryFlags,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
参数
lpPathName
要创建的目录的路径。
默认情况下,名称限制为 MAX_PATH 个字符。 若要将此限制扩展到 32,767 宽字符,请将“\\?\”前面追加到路径。 有关详细信息,请参阅 命名文件、路径和命名空间。
小提示
你可以选择加入以删除 MAX_PATH 限制,而无需追加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。
dwDesiredAccess
表示调用方对目录所需的访问类型的 ACCESS_MASK 值。 系统定义的 dwDesiredAccess 标志集确定以下特定的访问权限目录文件对象:
价值 | 含义 |
---|---|
FILE_LIST_DIRECTORY | 可以列出目录中的文件。 |
FILE_TRAVERSE | 可以遍历目录:也就是说,它可以是文件路径名的一部分。 |
SYNCHRONIZE | 可以等待返回的句柄与 I/O作的完成同步。 如果未为同步 I/O 打开句柄,则忽略此值。 |
dwShareMode
调用方想要在文件中使用的共享访问类型,为零,或用作以下值的一个或多个组合:
价值 | 含义 |
---|---|
00x00000000 |
如果其他进程请求删除、读取或写入访问权限,则阻止其他进程打开文件或设备。 |
FILE_SHARE_READ0x00000001 |
允许对文件或设备执行后续打开作以请求读取访问权限。 否则,如果进程请求读取访问权限,则其他进程无法打开文件或设备。 如果未指定此标志,但已打开文件或设备进行读取访问,则函数将失败。 |
FILE_SHARE_WRITE0x00000002 |
允许对文件或设备执行后续打开作以请求写入访问权限。 否则,如果进程请求写入访问权限,则其他进程无法打开文件或设备。 如果未指定此标志,但已打开文件或设备进行写入访问或具有写入访问权限的文件映射,则函数将失败。 |
FILE_SHARE_DELETE0x00000004 |
启用对文件或设备上的后续打开作以请求删除访问权限。 否则,如果进程请求删除访问权限,则无法打开文件或设备。 如果未指定此标志,但文件或设备已打开以删除访问权限,则函数将失败。 注意: 删除访问权限允许删除和重命名作。 |
DirectoryFlags
此参数可以包含 DIRECTORY_FLAGS的组合。
价值 | 含义 |
---|---|
DIRECTORY_FLAGS_DISALLOW_PATH_REDIRECTS0x00000001 |
阻止重新分析点或符号链接重定向 lpPathName 。 |
lpSecurityAttributes
指向 SECURITY_ATTRIBUTES 结构的指针。 结构的 lpSecurityDescriptor 成员为新目录指定安全描述符。 如果 lpSecurityAttributes 为 NULL
,则目录将获取默认的安全描述符。 目录的默认安全描述符中的 ACL 继承自其父目录。
目标文件系统必须支持对文件和目录的安全性,才能使此参数生效。 (当 GetVolumeInformation 返回 FS_PERSISTENT_ACLS 时,指示此项。
返回值
如果函数成功,则返回值为非零。
如果函数失败,则返回值INVALID_HANDLE_VALUE。 若要获取扩展的错误信息,请调用 GetLastError。
可能的错误包括:
返回代码 | 说明 |
---|---|
ERROR_ALREADY_EXISTS | 指定的目录已存在。 |
ERROR_PATH_NOT_FOUND | 一个或多个中间目录不存在;此函数只会在路径中创建最终目录。 |
ERROR_PATH_REDIRECTED | lpNewDirectory 由重新分析点和/或符号链接重定向。 |
注解
某些文件系统(如 NTFS 文件系统)支持单个文件和目录的压缩或加密。 在为此类文件系统格式化的卷上,新目录继承其父目录的压缩和加密属性。
应用程序可以通过调用具有FILE_FLAG_BACKUP_SEMANTICS标志集的 CreateFile 来获取目录的句柄。 有关代码示例,请参阅 CreateFile。
若要支持查询此对象的安全描述符的继承函数,可以启发式确定并报告继承是否有效。 有关详细信息,请参阅 可继承 ACE 的自动传播 。
以下技术支持此函数:
科技 | 支持 |
---|---|
服务器消息块 (SMB) 3.0 协议 | 是的 |
SMB 3.0 透明故障转移 (TFO) | 是的 |
具有横向扩展文件共享的 SMB 3.0 (SO) | 是的 |
群集共享卷文件系统 (CsvFS) | 是的 |
可复原文件系统 (ReFS) | 是的 |
注释
标头 fileapi.h
将 CreateDirectory2 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
例子
以下示例使用 CreateDirectory2 函数创建一个新目录。 使用 FILE_LIST_DIRECTORY 和 SYNCHRONIZE 访问权限创建新目录。 新目录也使用 FILE_SHARE_READ 共享模式创建,这样其他进程就可以打开目录进行读取访问。
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (C) Microsoft. All rights reserved
#include <Windows.h>
#include <stdio.h>
#include <strsafe.h>
int main(int argc, wchar_t* argv[])
{
WCHAR filePath[MAX_PATH] = { 0 };
// Create a directory to put a file into, that can't be deleted
// and redirected before this handle is closed.
HANDLE hDirectory = CreateDirectory2(argv[1],
FILE_LIST_DIRECTORY | SYNCHRONIZE,
FILE_SHARE_READ,
DIRECTORY_FLAGS_NONE,
NULL,
NULL);
if (hDirectory == INVALID_HANDLE_VALUE)
{
// Handle the error.
printf("CreateDirectory2 failed (%d)\n", GetLastError());
return (1);
}
StringCchPrintf(filePath,
ARRAYSIZE(filePath),
L"%ws\\example.test",
argv[1]);
HANDLE hFile = CreateFile3(filePath,
GENERIC_ALL,
FILE_SHARE_READ,
CREATE_ALWAYS,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
// Handle the error.
CloseHandle(hDirectory);
printf("CreateFile3 failed (%d)\n", GetLastError());
return (1);
}
CloseHandle(hFile);
CloseHandle(hDirectory);
return (0);
}
有关其他示例,请参阅 检索和更改文件属性。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 11 24H2 [桌面应用 |UWP 应用] |
支持的最低服务器 | Windows Server 2025 [桌面应用 |UWP 应用] |
标头 | fileapi.h (包括 Windows.h) |
图书馆 | 内核 32.lib |
DLL | Kernel32.dll |