Поделиться через


Функция CreateDirectory2A (fileapi.h)

Создает новый каталог. Если базовая файловая система поддерживает безопасность файлов и каталогов, функция применяет указанный дескриптор безопасности к новому каталогу.

Чтобы указать каталог шаблона, используйте функцию 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 Каталог можно пройти по пути: т. е. он может быть частью имени пути файла.
СИНХРОНИЗИРОВАТЬ Возвращенный дескриптор можно дождаться синхронизации с завершением операции ввода-вывода. Если дескриптор не был открыт для синхронного ввода-вывода, это значение игнорируется.

dwShareMode

Тип доступа к общей папке, который вызывающий объект хотел бы использовать в файле, как ноль, или как одно или сочетание следующих значений:

Ценность Значение
0
0x00000000
Запрещает другим процессам открывать файл или устройство, если они запрашивают доступ на удаление, чтение или запись.
FILE_SHARE_READ
0x00000001
Позволяет последующим операциям открытия на файле или устройстве запрашивать доступ на чтение. В противном случае другие процессы не могут открыть файл или устройство, если они запрашивают доступ на чтение. Если этот флаг не указан, но файл или устройство было открыто для доступа на чтение, функция завершается ошибкой.
FILE_SHARE_WRITE
0x00000002
Позволяет последующим операциям открытия на файле или устройстве запрашивать доступ на запись. В противном случае другие процессы не могут открыть файл или устройство, если они запрашивают доступ на запись. Если этот флаг не указан, но файл или устройство было открыто для доступа на запись или имеет сопоставление файлов с доступом на запись, функция завершается ошибкой.
FILE_SHARE_DELETE
0x00000004
Позволяет последующим операциям открытия на файле или устройстве запрашивать доступ к удалению. В противном случае другие процессы не могут открыть файл или устройство, если они запрашивают доступ к удалению. Если этот флаг не указан, но файл или устройство было открыто для удаления, функция завершается ошибкой.

Заметка: Доступ к удалению позволяет выполнять операции удаления и переименования.

DirectoryFlags

Этот параметр может содержать сочетания DIRECTORY_FLAGS.

Ценность Значение
DIRECTORY_FLAGS_DISALLOW_PATH_REDIRECTS
0x00000001
Запрет перенаправления lpPathName с помощью точек повторного анализа или символьных ссылок.

lpSecurityAttributes

Указатель на структуру SECURITY_ATTRIBUTES . Элемент lpSecurityDescriptor структуры задает дескриптор безопасности для нового каталога. Если lpSecurityAttributes имеет значение NULL, каталог получает дескриптор безопасности по умолчанию. Списки управления доступом в дескрипторе безопасности по умолчанию для каталога наследуются от родительского каталога.

Целевая файловая система должна поддерживать безопасность файлов и каталогов, чтобы этот параметр повлиял. (Это указывает, когда GetVolumeInformation возвращает FS_PERSISTENT_ACLS.)

Возвращаемое значение

Если функция выполнена успешно, возвращаемое значение ненулевое.

Если функция завершается ошибкой, возвращаемое значение INVALID_HANDLE_VALUE. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.

Возможные ошибки:

Код возврата Описание
ERROR_ALREADY_EXISTS Указанный каталог уже существует.
ERROR_PATH_NOT_FOUND Один или несколько промежуточных каталогов не существуют; Эта функция создаст только окончательный каталог в пути.
ERROR_PATH_REDIRECTED lpNewDirectory перенаправляется точками повторного анализа и (или) символьными ссылками.

Замечания

Некоторые файловые системы, такие как файловая система NTFS, поддерживают сжатие или шифрование отдельных файлов и каталогов. В томах, отформатированных для такой файловой системы, новый каталог наследует атрибуты сжатия и шифрования родительского каталога.

Приложение может получить дескриптор в каталог, вызвав CreateFile с набором флагов FILE_FLAG_BACKUP_SEMANTICS . Пример кода см. в разделе CreateFile.

Для поддержки функций наследования, запрашивающих дескриптор безопасности этого объекта, может эвристически определить и сообщить о том, что наследование действует. Дополнительные сведения см. в статье об автоматическом распространении наследуемых acES .

Эта функция поддерживается следующими технологиями:

Технология Поддерживается
Протокол SMB 3.0 Да
Отработка отказа SMB 3.0 (TFO) Да
SMB 3.0 с масштабируемыми общими папками (SO) Да
Файловая система общего тома кластера (CSVFS) Да
Отказоустойчивая файловая система (ReFS) Да

Примечание.

Заголовок fileapi.h определяет CreateDirectory2 как псевдоним, который автоматически выбирает версию 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)
Библиотека Файл Kernel32.lib
Библиотека dll Kernel32.dll

См. также

CreateFile3

DeleteFile2

RemoveDirectory2