基本概念

Windows API中,CreateDirectory函数用于在文件系统中创建一个新的目录。它是文件系统操作的基础API之一,常用于应用程序创建文件夹以存储数据或组织文件。
CreateDirectory 是一个宏,根据项目是否定义UNICODE宏,会映射到宽字符版本(CreateDirectoryW)或ANSI版本(CreateDirectoryA),

基本语法

1
2
3
4
5
6
7
8
9
BOOL CreateDirectoryW(
[in] LPCWSTR lpPathName, //要创建的目录路径
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes //安全属性(通常为NULL)
);

BOOL CreateDirectoryA(
[in] LPCSTR lpPathName,
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

返回值
成功:返回非零值(TRUE)
失败:返回0(FALSE)。可通过GetLastError函数获取具体错误原因,常见错误包括:
ERROR_ALREADY_EXISTS:指定的目录已存在。
ERROR_PATH_NOT_FOUND:路径中的父目录不存在(例如创建 C:\a\b 时,C:\a 不存在)。
ERROR_ACCESS_DENIED:没有创建目录的权限。

简单示例(宽字符版本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <windows.h>
#include <stdio.h>

int main() {
LPCWSTR dirPath = L"C:\\MyTestDirectory";

// 创建目录
BOOL success = CreateDirectoryW(dirPath, NULL);

if (success) {
wprintf(L"目录创建成功:%s\n", dirPath);
} else {
DWORD error = GetLastError();
if (error == ERROR_ALREADY_EXISTS) {
wprintf(L"错误:目录已存在\n");
} else if (error == ERROR_PATH_NOT_FOUND) {
wprintf(L"错误:父目录不存在\n");
} else {
wprintf(L"创建失败,错误码:%d\n", error);
}
}

return 0;
}

CreateDirectory2(A/W)

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HANDLE CreateDirectory2W(
LPCWSTR lpPathName, //要创建的目录路径
DWORD dwDesiredAccess,//对新创建项目的访问权限
DWORD dwShareMode, //共享模式
DIRECTORY_FLAGS DirectoryFlags,//禁用系统自动路径重定向,确保路径的精确性
LPSECURITY_ATTRIBUTES lpSecurityAttributes//安全属性
);

HANDLE CreateDirectory2A(
LPCSTR lpPathName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
DIRECTORY_FLAGS DirectoryFlags,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

相比于CreateDirectoryCreateDirectory2扩展提供了 “忽略已存在”“创建链接目录” 等高级能力。

CreateDirectoryEx

CreateDirectoryExWindows API中一个CreateDirectory的扩展函数,其核心特点是可以指定一个 “模板目录”(Template Directory),新创建的目录会复制模板目录的安全描述符(访问权限、审计规则等),而非默认继承父目录的安全属性。这在需要批量创建权限完全一致的目录时非常实用。

基本语法

1
2
3
4
5
BOOL CreateDirectoryExA(
[in] LPCSTR lpTemplateDirectory, //创建新目录时用作模板的目录的路径
[in] LPCSTR lpNewDirectory, //要创建的目录的路径
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes //安全属性
);

返回值
成功:返回非零值(TRUE),新目录创建成功且安全属性复制自模板目录。
失败:返回0(FALSE),通过GetLastError()获取具体错误,常见错误包括:
ERROR_ALREADY_EXISTS:新目录已存在。
ERROR_PATH_NOT_FOUND:新目录的父目录不存在。
ERROR_INVALID_NAME:模板目录或新目录的路径格式无效。
ERROR_ACCESS_DENIED:无权限访问模板目录或创建新目录。

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <windows.h>
#include <stdio.h>

// 辅助函数:打印错误信息
void PrintError(DWORD errorCode) {
wchar_t* errorMsg = NULL;
FormatMessageW(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR)&errorMsg, 0, NULL
);
if (errorMsg) {
wprintf(L"错误: %s\n", errorMsg);
LocalFree(errorMsg);
} else {
wprintf(L"未知错误,错误码: %d\n", errorCode);
}
}

int wmain() {
// 模板目录(必须已存在)
LPCWSTR templateDir = L"C:\\TemplateDirectory";
// 要创建的新目录
LPCWSTR newDir = L"C:\\NewDirectoryFromTemplate";

// 检查模板目录是否存在
DWORD attr = GetFileAttributesW(templateDir);
if (attr == INVALID_FILE_ATTRIBUTES || !(attr & FILE_ATTRIBUTE_DIRECTORY)) {
wprintf(L"模板目录不存在或不是目录: %s\n", templateDir);
return 1;
}

// 使用模板目录创建新目录
BOOL success = CreateDirectoryExW(
templateDir, // 复制此目录的安全属性
newDir, // 新目录路径
NULL // 安全属性(忽略,以模板为准)
);

if (success) {
wprintf(L"新目录创建成功: %s\n", newDir);
wprintf(L"安全属性已复制自模板目录: %s\n", templateDir);
} else {
DWORD error = GetLastError();
wprintf(L"创建失败: ");
PrintError(error);
}

return 0;
}