Compartir a través de


Función CreateDirectory2A (fileapi.h)

Crea un directorio nuevo. Si el sistema de archivos subyacente admite la seguridad en archivos y directorios, la función aplica un descriptor de seguridad especificado al nuevo directorio.

Para especificar un directorio de plantilla, use la función CreateDirectoryEx .

Para realizar esta operación como una operación de transacción, use la función CreateDirectoryTransacted .

Sintaxis

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

Parámetros

lpPathName

Ruta de acceso del directorio que se va a crear.

De forma predeterminada, el nombre está limitado a MAX_PATH caracteres. Para ampliar este límite a 32 767 caracteres anchos, anteponga "\\?\\ " a la ruta de acceso. Para obtener más información, vea Nombres de archivos, rutas de acceso y espacios de nombres.

Sugerencia

Puede optar por quitar la limitación de MAX_PATH sin prepending "\\?\". Consulte la sección "Limitación máxima de longitud de ruta de acceso" de nomenclatura de archivos, rutas de acceso y espacios de nombres para obtener más información.

dwDesiredAccess

Valor de ACCESS_MASK que expresa el tipo de acceso que requiere el autor de la llamada al directorio. El conjunto de marcas dwDesiredAccess definidas por el sistema determina los siguientes objetos de archivo de directorio de derechos de acceso específicos:

Valor Significado
FILE_LIST_DIRECTORY Los archivos del directorio se pueden enumerar.
FILE_TRAVERSE El directorio se puede recorrer: es decir, puede formar parte del nombre de ruta de acceso de un archivo.
SINCRONIZAR El identificador devuelto se puede esperar a que se sincronice con la finalización de una operación de E/S. Si el identificador no se abrió para E/S sincrónica, se omite este valor.

dwShareMode

Tipo de acceso compartido que el autor de la llamada desea usar en el archivo, como cero, o como una o una combinación de los valores siguientes:

Valor Significado
0
0x00000000
Impide que otros procesos abran un archivo o dispositivo si solicitan acceso de eliminación, lectura o escritura.
FILE_SHARE_READ
0x00000001
Habilita las operaciones abiertas posteriores en un archivo o dispositivo para solicitar acceso de lectura. De lo contrario, otros procesos no pueden abrir el archivo o el dispositivo si solicitan acceso de lectura. Si no se especifica esta marca, pero se ha abierto el archivo o el dispositivo para el acceso de lectura, se produce un error en la función.
FILE_SHARE_WRITE
0x00000002
Habilita las operaciones abiertas posteriores en un archivo o dispositivo para solicitar acceso de escritura. De lo contrario, otros procesos no pueden abrir el archivo o el dispositivo si solicitan acceso de escritura. Si no se especifica esta marca, pero el archivo o dispositivo se ha abierto para el acceso de escritura o tiene una asignación de archivos con acceso de escritura, se produce un error en la función.
FILE_SHARE_DELETE
0x00000004
Habilita las operaciones abiertas posteriores en un archivo o dispositivo para solicitar el acceso de eliminación. De lo contrario, otros procesos no pueden abrir el archivo o el dispositivo si solicitan el acceso de eliminación. Si no se especifica esta marca, pero se ha abierto el archivo o el dispositivo para el acceso de eliminación, se produce un error en la función.

Nota: El acceso de eliminación permite las operaciones de eliminación y cambio de nombre.

DirectoryFlags

Este parámetro puede contener combinaciones de DIRECTORY_FLAGS.

Valor Significado
DIRECTORY_FLAGS_DISALLOW_PATH_REDIRECTS
0x00000001
Impedir que lpPathName sea redirigido por puntos de reanálisis o vínculos simbólicos.

lpSecurityAttributes

Puntero a una estructura de SECURITY_ATTRIBUTES . El miembro lpSecurityDescriptor de la estructura especifica un descriptor de seguridad para el nuevo directorio. Si lpSecurityAttributes es NULL, el directorio obtiene un descriptor de seguridad predeterminado. Las ACL del descriptor de seguridad predeterminado para un directorio se heredan de su directorio primario.

El sistema de archivos de destino debe admitir la seguridad en archivos y directorios para que este parámetro tenga un efecto. (Esto se indica cuando GetVolumeInformation devuelve FS_PERSISTENT_ACLS).

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es distinto de cero.

Si se produce un error en la función, se INVALID_HANDLE_VALUE el valor devuelto. Para obtener información de error extendida, llame a GetLastError.

Entre los posibles errores se incluyen los siguientes:

Código de retorno Descripción
ERROR_ALREADY_EXISTS El directorio especificado ya existe.
ERROR_PATH_NOT_FOUND Uno o varios directorios intermedios no existen; esta función solo creará el directorio final en la ruta de acceso.
ERROR_PATH_REDIRECTED lpNewDirectory fue redirigido por puntos de reanálisis o vínculos simbólicos.

Observaciones

Algunos sistemas de archivos, como el sistema de archivos NTFS, admiten compresión o cifrado para archivos y directorios individuales. En los volúmenes con formato para este tipo de sistema de archivos, un nuevo directorio hereda los atributos de compresión y cifrado de su directorio primario.

Una aplicación puede obtener un identificador para un directorio llamando a CreateFile con el conjunto de marcas FILE_FLAG_BACKUP_SEMANTICS . Para obtener un ejemplo de código, vea CreateFile.

Para admitir funciones de herencia que consultan el descriptor de seguridad de este objeto puede determinar y notificar de forma heurística que la herencia está en vigor. Consulte Propagación automática de ACE herederas para obtener más información.

Esta función es compatible con las siguientes tecnologías:

Tecnología Compatible
Protocolo bloque de mensajes del servidor (SMB) 3.0
Conmutación por error transparente (TFO) de SMB 3.0
SMB 3.0 con recursos compartidos de archivos de escalabilidad horizontal (SO)
Sistema de archivos de volumen compartido de clúster (CsvFS)
Sistema de archivos resistente (ReFS)

Nota:

El fileapi.h encabezado define CreateDirectory2 como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Conventions for Function Prototypes.

Ejemplos

En el ejemplo siguiente se crea un nuevo directorio con la función CreateDirectory2 . El nuevo directorio se crea con los derechos de acceso FILE_LIST_DIRECTORY y SYNCHRONIZE . El nuevo directorio también se crea con el modo de recurso compartido FILE_SHARE_READ , lo que permite que otros procesos abran el directorio para el acceso de lectura.

// 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);
}

Para obtener ejemplos adicionales, consulte Recuperación y cambio de atributos de archivo.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 11 24H2 [aplicaciones de escritorio | Aplicaciones para UWP]
servidor mínimo admitido Windows Server 2025 [aplicaciones de escritorio | Aplicaciones para UWP]
encabezado fileapi.h (incluya Windows.h)
Biblioteca kernel32.lib
DLL de Kernel32.dll

Consulte también

CreateFile3

DeleteFile2

RemoveDirectory2