새 디렉터리를 만듭니다. 기본 파일 시스템에서 파일 및 디렉터리에 대한 보안을 지원하는 경우 함수는 지정된 보안 설명자를 새 디렉터리에 적용합니다.
템플릿 디렉터리를 지정하려면 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 | 디렉터리를 트래버스할 수 있습니다. 즉, 파일의 경로 이름에 속할 수 있습니다. |
| 동기화 | 반환된 핸들은 I/O 작업의 완료와 동기화하기 위해 대기할 수 있습니다. 동기 I/O에 대한 핸들을 열지 않은 경우 이 값은 무시됩니다. |
dwShareMode
호출자가 파일에서 0으로 사용하거나 다음 값의 조합으로 사용하려는 공유 액세스 유형입니다.
| 가치 | 의미 |
|---|---|
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 반환할 때 표시됩니다.
반환 값
함수가 성공하면 반환 값은 0이 아닌 값입니다.
함수가 실패하면 반환 값이 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(투명한 장애 조치(failover) | 예 |
| SO(스케일 아웃 파일 공유)가 있는 SMB 3.0 | 예 |
| CsvFS(클러스터 공유 볼륨 파일 시스템) | 예 |
| ReFS(복원 파일 시스템) | 예 |
비고
헤더는 fileapi.hCREATEDirectory2 를 UNICODE 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입 대한규칙을 참조하세요.
예시
다음 예제에서는 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 |