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
Establezca en TRUE para especificar que si ya existe un archivo con el nombre especificado, se debe reemplazar por el archivo especificado. Se establece en FALSE si se produce un error en la operación de cambio de nombre 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, debe reemplazarse 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 en él. 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 directorio nuevo, suprima las reglas de herencia relacionadas con el FILE_ATTRIBUTE_PINNED y FILE_ATTRIBUTE_UNPINNED atributos del archivo. |
FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE (0x00000008) | Al cambiar el nombre de un archivo a un directorio nuevo, suprima las reglas de herencia relacionadas con la propiedad id. de reserva de almacenamiento del archivo. |
FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE (0x00000010) | Si tampoco se especifica FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE, 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. Requiere administrar el acceso al volumen. |
FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE (0x00000020) | Si no se especifica también FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE, 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 disminuya. 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 también FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE, 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 cuyo nombre se va a cambiar. Requiere administrar el acceso al volumen. |
FILE_RENAME_FORCE_RESIZE_SOURCE_SR (0x00000100) | Si tampoco se especifica FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE, 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 cuyo nombre se va a cambiar. 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
Establezca en TRUE para especificar que si ya existe un archivo con el nombre especificado, se debe reemplazar por el archivo especificado. Se establece en FALSE si se produce un error en la operación de cambio de nombre 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 otro directorio, o si el miembro FileName 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 su nombre.
Para realizar dos operaciones abiertas que no provoquen 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 del 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 por 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.
Comentarios
La estructura FILE_RENAME_INFORMATION se usa para cambiar el nombre de un archivo. Esta operación se puede realizar de cualquiera de las siguientes maneras:
Llame a FltSetInformationFile o ZwSetInformationFile, pasando FileRenameInformation como valor de FileInformationClass y pasando un búfer asignado por el llamador con formato de estructura FILE_RENAME_INFORMATION para el valor de FileInformation. El parámetro FileHandle especifica el archivo cuyo nombre se va a cambiar.
Cree un IRP con IRP_MJ_SET_INFORMATION de código de función principal.
Los minifiltros del sistema de archivos deben usar FltSetInformationFile, no ZwSetInformationFile, para cambiar el nombre de un archivo.
Cambiar el 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 cualquiera 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 del 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 este no es un cambio de nombre verdadero, porque deja atrás un flujo de datos predeterminado de longitud cero.
El tamaño del búfer FileInformation pasado a ZwSetInformationFile o FltSetInformationFile debe ser >= sizeof(FILE_RENAME_INFORMATION) más el tamaño en bytes de la cadena FileName .
Requisitos
Requisito | Valor |
---|---|
Header | ntifs.h (incluya Ntifs.h, Fltkernel.h) |