基本概念
在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 );
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 );
|
相比于CreateDirectory,CreateDirectory2扩展提供了 “忽略已存在”“创建链接目录” 等高级能力。
CreateDirectoryEx
CreateDirectoryEx是Windows 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; }
|