新しいディレクトリを作成します。 基になるファイル システムがファイルとディレクトリのセキュリティをサポートしている場合、関数は指定されたセキュリティ記述子を新しいディレクトリに適用します。
テンプレート ディレクトリを指定するには、 CreateDirectoryEx 関数を使用します。
この操作をトランザクション操作として実行するには、 CreateDirectoryTransacted 関数を使用します。
構文
HANDLE CreateDirectory2W(
LPCWSTR 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、または次の値の 1 つまたは組み合わせとして使用します。
価値 | 意味 |
---|---|
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 以外です。
関数が失敗した場合、戻り値は 0 です。 拡張エラー情報を取得するには、GetLastError
考えられるエラーは次のとおりです。
リターン コード | 説明 |
---|---|
ERROR_ALREADY_EXISTS | 指定したディレクトリが既に存在します。 |
ERROR_PATH_NOT_FOUND | 1 つ以上の中間ディレクトリが存在しません。この関数は、パス内に最終的なディレクトリのみを作成します。 |
注釈
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 |