estrutura FILE_RENAME_INFORMATION (ntifs.h)

A estrutura FILE_RENAME_INFORMATION é usada para renomear um arquivo.

Sintaxe

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;

Membros

DUMMYUNIONNAME

DUMMYUNIONNAME.ReplaceIfExists

Defina como TRUE para especificar que, se um arquivo com o nome fornecido já existir, ele deverá ser substituído pelo arquivo fornecido. Defina como FALSE se a operação de renomeação falhar se um arquivo com o nome fornecido já existir.

DUMMYUNIONNAME.Flags

Sinalizadores para a operação de renomeação. Esse campo só é aplicável quando usado com a classe de informações FileRenameInformationEx .

Estes são os valores possíveis:

Valor Significado
FILE_RENAME_REPLACE_IF_EXISTS (0x00000001) Se já existir um arquivo com o nome fornecido, ele deverá ser substituído pelo arquivo fornecido. Equivalente ao campo ReplaceIfExists usado com a classe de informações FileRenameInformation.
FILE_RENAME_POSIX_SEMANTICS (0x00000002) Se FILE_RENAME_REPLACE_IF_EXISTS também for especificado, permita a substituição de um arquivo mesmo se houver identificadores existentes nele. Os identificadores existentes para o arquivo substituído continuam a ser válidos para operações como leitura e gravação. Qualquer abertura subsequente do nome de destino abrirá o arquivo renomeado, não o arquivo substituído.
FILE_RENAME_SUPPRESS_PIN_STATE_INHERITANCE (0x00000004) Ao renomear um arquivo para um novo diretório, suprima todas as regras de herança relacionadas ao FILE_ATTRIBUTE_PINNED e FILE_ATTRIBUTE_UNPINNED atributos do arquivo.
FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE (0x00000008) Ao renomear um arquivo para um novo diretório, suprima todas as regras de herança relacionadas à propriedade de ID de reserva de armazenamento do arquivo.
FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE (0x00000010) Se FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE também não for especificado, ao renomear um arquivo para um novo diretório, redimensione automaticamente as áreas de reserva de armazenamento afetadas conforme necessário para impedir que o espaço livre visível do usuário no volume aumente. Requer o gerenciamento do acesso ao volume.
FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE (0x00000020) Se FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE também não for especificado, ao renomear um arquivo para um novo diretório, redimensione automaticamente as áreas de reserva de armazenamento afetadas conforme necessário para impedir que o espaço livre visível do usuário no volume dimpecifique. Requer o gerenciamento do acesso ao volume.
FILE_RENAME_PRESERVE_AVAILABLE_SPACE (0x00000030) Equivalente a especificar FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE e FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE.
FILE_RENAME_IGNORE_READONLY_ATTRIBUTE (0x00000040) Se FILE_RENAME_REPLACE_IF_EXISTS também for especificado, permita a substituição de um arquivo mesmo que seja somente leitura. Requer WRITE_ATTRIBUTES acesso ao arquivo substituído.
FILE_RENAME_FORCE_RESIZE_TARGET_SR (0x00000080) Se FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE também não for especificado, ao renomear um arquivo para um novo diretório que faça parte de uma área de reserva de armazenamento diferente, sempre aumente a área de reserva de armazenamento do diretório de destino pelo tamanho total do arquivo que está sendo renomeado. Requer o gerenciamento do acesso ao volume.
FILE_RENAME_FORCE_RESIZE_SOURCE_SR (0x00000100) Se FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE também não for especificado, ao renomear um arquivo para um novo diretório que faça parte de uma área de reserva de armazenamento diferente, sempre reduza a área de reserva de armazenamento do diretório de origem pelo tamanho total do arquivo que está sendo renomeado. Requer o gerenciamento do acesso ao volume.
FILE_RENAME_FORCE_RESIZE_SR (0x00000180) Equivalente a especificar FILE_RENAME_FORCE_RESIZE_TARGET_SR e FILE_RENAME_FORCE_RESIZE_SOURCE_SR.

ReplaceIfExists

Defina como TRUE para especificar que, se um arquivo com o nome fornecido já existir, ele deverá ser substituído pelo arquivo fornecido. Defina como FALSE se a operação de renomeação falhar se um arquivo com o nome fornecido já existir.

RootDirectory

Um identificador que IopOpenLinkOrRenameTarget usa para abrir o diretório de destino.

Se o arquivo não estiver sendo movido para um diretório diferente ou se o membro FileName contiver o nome de caminho completo, esse membro será NULL. Caso contrário, ele é um identificador para o diretório raiz no qual o arquivo residirá depois de ser renomeado.

Para executar duas operações abertas que não causarão um conflito de compartilhamento, você pode abrir o RootDirectory solicitando passagem | read-attribute. IopOpenLinkOrRenameTarget pode executar uma abertura relativa solicitando FILE_WRITE_DATA | SINCRONIZAR. Essas duas aberturas não causariam conflito de compartilhamento.

FileNameLength

Comprimento, em bytes, do novo nome do arquivo.

FileName[1]

O primeiro caractere de uma cadeia de caracteres largos que contém o novo nome do arquivo. Isso é seguido na memória pelo restante da cadeia de caracteres. Se o membro RootDirectory for NULL e o arquivo estiver sendo movido para um diretório diferente, esse membro especificará o nome de caminho completo a ser atribuído ao arquivo. Caso contrário, ele especifica apenas o nome do arquivo ou um nome de caminho relativo.

Comentários

A estrutura FILE_RENAME_INFORMATION é usada para renomear um arquivo. Essa operação pode ser executada de qualquer uma das seguintes maneiras:

  • Chame FltSetInformationFile ou ZwSetInformationFile, passando FileRenameInformation como o valor de FileInformationClass e passando um buffer alocado pelo chamador formatado como uma estrutura FILE_RENAME_INFORMATION para o valor de FileInformation. O parâmetro FileHandle especifica o arquivo a ser renomeado.

  • Crie um IRP com o código de função principal IRP_MJ_SET_INFORMATION.

Os minifiltros do sistema de arquivos devem usar FltSetInformationFile, não ZwSetInformationFile, para renomear um arquivo.

Renomear um arquivo requer acesso DELETE ao arquivo para que a entrada de diretório possa ser removida do diretório pai atual, bem como o acesso apropriado para criar a nova entrada no novo arquivo de diretório pai.

A cadeia de caracteres de nome de arquivo no membro FileName deve ser especificada em um dos formulários a seguir.

  • Um nome de arquivo simples. (O membro RootDirectory é NULL.) Nesse caso, o arquivo é simplesmente renomeado no mesmo diretório. Ou seja, a operação de renomeação altera o nome do arquivo, mas não sua localização.

  • Um nome de arquivo totalmente qualificado. (O membro RootDirectory é NULL.) Nesse caso, a operação de renomeação altera o nome e o local do arquivo.

  • Um nome de arquivo relativo. Nesse caso, o membro RootDirectory contém um identificador para o diretório de destino da operação de renomeação. O nome do arquivo em si deve ser um nome de arquivo simples.

Regras gerais para operações de renomeação:

  • Um arquivo ou diretório só pode ser renomeado em um volume. Em outras palavras, uma operação de renomeação não pode fazer com que um arquivo ou diretório seja movido para um volume diferente.

  • O diretório raiz de um volume não pode ser renomeado.

  • Se ReplaceIfExists estiver definido como FALSE e o destino existir, a operação de renomeação falhará.

  • Mesmo que ReplaceIfExists esteja definido como TRUE, a operação de renomeação ainda falhará se um arquivo com o mesmo nome já existir e for um diretório, um arquivo somente leitura ou um arquivo em execução no momento.

  • Os arquivos e diretórios de um volume não poderão ser renomeados se o volume for um volume somente leitura, como um volume CDFS ou um volume NTFS somente leitura.

Regras especiais para renomear arquivos abertos:

  • Um arquivo não poderá ser renomeado se tiver identificadores abertos, a menos que esteja aberto apenas devido a um bloqueio oportunista em lote (oplock) e o oplock em lote possa ser quebrado imediatamente.

  • Um arquivo não poderá ser renomeado se existir um arquivo com o mesmo nome e tiver identificadores abertos (exceto no caso de oplock em lote descrito anteriormente).

  • Um diretório não poderá ser renomeado se ele ou qualquer um de seus subdiretórios contiver um arquivo que tenha identificadores abertos (exceto no caso de oplock em lote descrito anteriormente).

Regras especiais para renomear fluxos de dados NTFS:

  • O fluxo de diretório padrão não pode ser renomeado.

  • O novo nome do fluxo deve começar com dois-pontos (:).

  • Um fluxo de dados só pode ser renomeado no mesmo arquivo. Em outras palavras, uma operação de renomeação não pode fazer com que um fluxo de dados seja movido para um arquivo diferente.

  • Um fluxo de dados em um diretório não pode ser renomeado para o fluxo de dados padrão.

  • Se ReplaceIfExists for definido como TRUE, a operação de renomeação só terá êxito se um fluxo com o mesmo nome não existir ou for um fluxo de dados de comprimento zero.

  • "Renomeando" o fluxo de dados padrão é permitido, mas essa não é uma renomeação verdadeira, pois deixa para trás um fluxo de dados padrão de comprimento zero.

O tamanho do buffer FileInformation passado para ZwSetInformationFile ou FltSetInformationFile deve ser >= sizeof(FILE_RENAME_INFORMATION) mais o tamanho em bytes da cadeia de caracteres FileName .

Requisitos

Requisito Valor
Cabeçalho ntifs.h (inclua Ntifs.h, Fltkernel.h)

Confira também

FltSetInformationFile

IRP_MJ_SET_INFORMATION

ZwSetInformationFile