Compartir a través de


estructura FILE_RENAME_INFORMATION (ntifs.h)

La estructura FILE_RENAME_INFORMATION se usa para cambiar el nombre de un archivo.

Sintaxis

typedef struct _FILE_RENAME_INFORMATION {
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS1)
    union {
        BOOLEAN ReplaceIfExists;  // FileRenameInformation
        ULONG Flags;              // FileRenameInformationEx
    } DUMMYUNIONNAME;
#else
    BOOLEAN ReplaceIfExists;
#endif
    HANDLE RootDirectory;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;

Miembros

DUMMYUNIONNAME

DUMMYUNIONNAME.ReplaceIfExists

Establézcalo en TRUE para especificar que si ya existe un archivo con el nombre especificado, se debe reemplazar por el archivo especificado. Establézcalo en FALSE si la operación de cambio de nombre debe producir un error si ya existe un archivo con el nombre especificado.

DUMMYUNIONNAME.Flags

Marcas para la operación de cambio de nombre. Este campo solo es aplicable cuando se usa con la clase de información FileRenameInformationEx.

Estos son los valores posibles:

Valor Significado
FILE_RENAME_REPLACE_IF_EXISTS (0x00000001) Si ya existe un archivo con el nombre especificado, se debe reemplazar por el archivo especificado. Equivalente al campo ReplaceIfExists usado con la clase de información FileRenameInformation.
FILE_RENAME_POSIX_SEMANTICS (0x00000002) Si también se especifica FILE_RENAME_REPLACE_IF_EXISTS, permita reemplazar un archivo aunque haya identificadores existentes. Los identificadores existentes en el archivo reemplazado siguen siendo válidos para operaciones como lectura y escritura. Cualquier apertura posterior del nombre de destino abrirá el archivo cuyo nombre ha cambiado, no el archivo reemplazado.
FILE_RENAME_SUPPRESS_PIN_STATE_INHERITANCE (0x00000004) Al cambiar el nombre de un archivo a un nuevo directorio, suprima las reglas de herencia relacionadas con los atributos FILE_ATTRIBUTE_PINNED y FILE_ATTRIBUTE_UNPINNED del archivo.
FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE (0x00000008) Al cambiar el nombre de un archivo a un nuevo directorio, suprima las reglas de herencia relacionadas con la propiedad id. de reserva de almacenamiento del archivo.
FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE (0x00000010) Si no se especifica FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE también, al cambiar el nombre de un archivo a un nuevo directorio, cambie automáticamente el tamaño de las áreas de reserva de almacenamiento afectadas según sea necesario para evitar que el usuario pueda ver espacio libre en el volumen. Requiere administrar el acceso al volumen.
FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE (0x00000020) Si no se especifica FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE también, al cambiar el nombre de un archivo a un nuevo directorio, cambie automáticamente el tamaño de las áreas de reserva de almacenamiento afectadas según sea necesario para evitar que el usuario vea espacio libre en el volumen disminuye. Requiere administrar el acceso al volumen.
FILE_RENAME_PRESERVE_AVAILABLE_SPACE (0x00000030) Equivalente a especificar FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE y FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE.
FILE_RENAME_IGNORE_READONLY_ATTRIBUTE (0x00000040) Si también se especifica FILE_RENAME_REPLACE_IF_EXISTS, permita reemplazar un archivo aunque sea de solo lectura. Requiere WRITE_ATTRIBUTES acceso al archivo reemplazado.
FILE_RENAME_FORCE_RESIZE_TARGET_SR (0x00000080) Si no se especifica FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE también, al cambiar el nombre de un archivo a un nuevo directorio que forma parte de un área de reserva de almacenamiento diferente, aumente siempre el área de reserva de almacenamiento del directorio de destino por el tamaño completo del archivo al que se va a cambiar el nombre. Requiere administrar el acceso al volumen.
FILE_RENAME_FORCE_RESIZE_SOURCE_SR (0x00000100) Si no se especifica FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE también, al cambiar el nombre de un archivo a un nuevo directorio que forma parte de un área de reserva de almacenamiento diferente, reduzca siempre el área de reserva de almacenamiento del directorio de origen por el tamaño completo del archivo al que se va a cambiar el nombre. Requiere administrar el acceso al volumen.
FILE_RENAME_FORCE_RESIZE_SR (0x00000180) Equivalente a especificar FILE_RENAME_FORCE_RESIZE_TARGET_SR y FILE_RENAME_FORCE_RESIZE_SOURCE_SR.

ReplaceIfExists

Establézcalo en TRUE para especificar que si ya existe un archivo con el nombre especificado, se debe reemplazar por el archivo especificado. Establézcalo en FALSE si la operación de cambio de nombre debe producir un error si ya existe un archivo con el nombre especificado.

RootDirectory

Identificador que IopOpenLinkOrRenameTarget usa para abrir el directorio de destino.

Si el archivo no se mueve a un directorio diferente o si el fileName miembro contiene el nombre de ruta de acceso completo, este miembro es NULL. De lo contrario, es un identificador para el directorio raíz en el que residirá el archivo después de cambiar el nombre.

Para realizar dos operaciones abiertas que no provocarán un conflicto de uso compartido, puede abrir RootDirectory solicitando recorrido | read-attribute. IopOpenLinkOrRenameTarget puede realizar una apertura relativa solicitando FILE_WRITE_DATA | SINCRONIZAR. Estas dos aperturas no provocarían conflictos de uso compartido.

FileNameLength

Longitud, en bytes, del nuevo nombre para el archivo.

FileName[1]

Primer carácter de una cadena de caracteres anchos que contiene el nuevo nombre del archivo. Esto va seguido de la memoria en el resto de la cadena. Si el miembro rootDirectory es NULL y el archivo se mueve a otro directorio, este miembro especifica el nombre de ruta de acceso completo que se asignará al archivo. De lo contrario, especifica solo el nombre de archivo o un nombre de ruta de acceso relativo.

Observaciones

La estructura FILE_RENAME_INFORMATION se usa para cambiar el nombre de un archivo. Esta operación se puede realizar de cualquiera de las maneras siguientes:

  • Llame a FltSetInformationFile o ZwSetInformationFile, pasando FileRenameInformation como valor de FileInformationClass y pasando un búfer asignado por el autor de la llamada con formato de FILE_RENAME_INFORMATION para el valor de FileInformation. El parámetro FileHandle especifica el archivo al que se va a cambiar el nombre.

  • Cree un IRP con código de función principal IRP_MJ_SET_INFORMATION.

Los minifiltros del sistema de archivos deben usar FltSetInformationFile, no ZwSetInformationFile, para cambiar el nombre de un archivo.

El cambio de nombre de un archivo requiere acceso DELETE al archivo para que la entrada del directorio se pueda quitar del directorio primario actual, así como el acceso adecuado para crear la nueva entrada en el nuevo archivo de directorio primario.

La cadena de nombre de archivo del miembro fileName debe especificarse en uno de los siguientes formularios.

  • Un nombre de archivo simple. (El miembro RootDirectory es NULL). En este caso, el archivo simplemente se cambia de nombre dentro del mismo directorio. Es decir, la operación de cambio de nombre cambia el nombre del archivo, pero no su ubicación.

  • Nombre de archivo completo. (El miembro RootDirectory es NULL). En este caso, la operación de cambio de nombre cambia el nombre y la ubicación del archivo.

  • Nombre de archivo relativo. En este caso, el miembro RootDirectory contiene un identificador para el directorio de destino para la operación de cambio de nombre. El propio nombre de archivo debe ser un nombre de archivo simple.

Reglas generales para las operaciones de cambio de nombre:

  • Solo se puede cambiar el nombre de un archivo o directorio dentro de un volumen. En otras palabras, una operación de cambio de nombre no puede hacer que un archivo o directorio se mueva a un volumen diferente.

  • No se puede cambiar el nombre del directorio raíz de un volumen.

  • Si replaceIfExists está establecido en FALSE y el destino existe, se producirá un error en la operación de cambio de nombre.

  • Incluso si replaceIfExists está establecido en TRUE, la operación de cambio de nombre seguirá produciendo un error si ya existe un archivo con el mismo nombre y es un directorio, un archivo de solo lectura o un archivo que se está ejecutando actualmente.

  • No se puede cambiar el nombre de los archivos y directorios de un volumen si el volumen es de solo lectura, como un volumen CDFS o un volumen NTFS de solo lectura.

Reglas especiales para cambiar el nombre de los archivos abiertos:

  • No se puede cambiar el nombre de un archivo si tiene identificadores abiertos, a menos que solo esté abierto debido a un bloqueo oportunista por lotes (oplock) y el interbloqueo por lotes se puede romper inmediatamente.

  • No se puede cambiar el nombre de un archivo si existe un archivo con el mismo nombre y tiene identificadores abiertos (excepto en el caso batch-oplock descrito anteriormente).

  • No se puede cambiar el nombre de un directorio si contiene o alguno de sus subdirectorios un archivo que tiene identificadores abiertos (excepto en el caso batch-oplock descrito anteriormente).

Reglas especiales para cambiar el nombre de flujos de datos NTFS:

  • No se puede cambiar el nombre del flujo de directorio predeterminado.

  • El nuevo nombre de la secuencia debe comenzar con dos puntos (:).

  • Solo se puede cambiar el nombre de un flujo de datos dentro de el mismo archivo. En otras palabras, una operación de cambio de nombre no puede hacer que un flujo de datos se mueva a un archivo diferente.

  • No se puede cambiar el nombre de un flujo de datos en un directorio al flujo de datos predeterminado.

  • Si ReplaceIfExists se establece en TRUE, la operación de cambio de nombre solo se realizará correctamente si una secuencia con el mismo nombre no existe o es una secuencia de datos de longitud cero.

  • Se permite "cambiar el nombre" del flujo de datos predeterminado, pero no se trata de un verdadero cambio de nombre, ya que deja atrás un flujo de datos predeterminado de longitud cero.

El tamaño del búfer de FileInformation pasado a ZwSetInformationFile o FltSetInformationFile debe ser >= sizeof(FILE_RENAME_INFORMATION) más el tamaño en bytes de la cadena FileName de.

Requisitos

Requisito Valor
encabezado de ntifs.h (incluya Ntifs.h, Fltkernel.h)

Consulte también

fltSetInformationFile

IRP_MJ_SET_INFORMATION

ZwSetInformationFile