Partager via


FILE_RENAME_INFORMATION structure (ntifs.h)

La structure FILE_RENAME_INFORMATION est utilisée pour renommer un fichier.

Syntaxe

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;

Membres

DUMMYUNIONNAME

DUMMYUNIONNAME.ReplaceIfExists

Définissez sur TRUE pour spécifier que si un fichier portant le nom donné existe déjà, il doit être remplacé par le fichier donné. Définissez sur FALSE si l’opération de renommage doit échouer si un fichier portant le nom donné existe déjà.

DUMMYUNIONNAME.Flags

Indicateurs pour l’opération de renommage. Ce champ s’applique uniquement lorsqu’il est utilisé avec la classe d’informations FileRenameInformationEx .

Les valeurs possibles sont les suivantes :

Valeur Signification
FILE_RENAME_REPLACE_IF_EXISTS (0x00000001) S’il existe déjà un fichier portant le nom donné, il doit être remplacé par le fichier donné. Équivalent au champ ReplaceIfExists utilisé avec la classe d’informations FileRenameInformation.
FILE_RENAME_POSIX_SEMANTICS (0x00000002) Si FILE_RENAME_REPLACE_IF_EXISTS est également spécifié, autorisez le remplacement d’un fichier même s’il existe des descripteurs. Les descripteurs existants du fichier remplacé continuent d’être valides pour les opérations telles que la lecture et l’écriture. Toutes les ouvertures suivantes du nom cible ouvrent le fichier renommé, et non le fichier remplacé.
FILE_RENAME_SUPPRESS_PIN_STATE_INHERITANCE (0x00000004) Lorsque vous renommez un fichier dans un nouveau répertoire, supprimez toutes les règles d’héritage liées aux attributs FILE_ATTRIBUTE_PINNED et FILE_ATTRIBUTE_UNPINNED du fichier.
FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE (0x00000008) Lorsque vous renommez un fichier en un nouveau répertoire, supprimez toutes les règles d’héritage liées à la propriété d’ID de réserve de stockage du fichier.
FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE (0x00000010) Si FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE n’est pas également spécifié, lorsque vous renommez un fichier dans un nouveau répertoire, redimensionnez automatiquement les zones de réserve de stockage affectées si nécessaire pour empêcher l’augmentation de l’espace libre visible par l’utilisateur sur le volume. Nécessite la gestion de l’accès aux volumes.
FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE (0x00000020) Si FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE n’est pas également spécifié, lorsque vous renommez un fichier en un nouveau répertoire, redimensionnez automatiquement les zones de réserve de stockage affectées si nécessaire pour empêcher la diminution de l’espace libre visible par l’utilisateur sur le volume. Nécessite la gestion de l’accès aux volumes.
FILE_RENAME_PRESERVE_AVAILABLE_SPACE (0x00000030) Équivaut à spécifier à la fois FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE et FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE.
FILE_RENAME_IGNORE_READONLY_ATTRIBUTE (0x00000040) Si FILE_RENAME_REPLACE_IF_EXISTS est également spécifié, autorisez le remplacement d’un fichier même s’il est en lecture seule. Nécessite WRITE_ATTRIBUTES accès au fichier remplacé.
FILE_RENAME_FORCE_RESIZE_TARGET_SR (0x00000080) Si FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE n’est pas également spécifié, lorsque vous renommez un fichier dans un nouveau répertoire qui fait partie d’une autre zone de réserve de stockage, augmentez toujours la zone de réserve de stockage du répertoire cible en fonction de la taille du fichier renommé. Nécessite la gestion de l’accès aux volumes.
FILE_RENAME_FORCE_RESIZE_SOURCE_SR (0x00000100) Si FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE n’est pas également spécifié, lorsque vous renommez un fichier dans un nouveau répertoire qui fait partie d’une autre zone de réserve de stockage, réduisez toujours la zone de réserve de stockage du répertoire source par la taille du fichier renommé. Nécessite la gestion de l’accès aux volumes.
FILE_RENAME_FORCE_RESIZE_SR (0x00000180) Équivaut à spécifier à la fois FILE_RENAME_FORCE_RESIZE_TARGET_SR et FILE_RENAME_FORCE_RESIZE_SOURCE_SR.

ReplaceIfExists

Définissez sur TRUE pour spécifier que si un fichier portant le nom donné existe déjà, il doit être remplacé par le fichier donné. Définissez sur FALSE si l’opération de renommage doit échouer si un fichier portant le nom donné existe déjà.

RootDirectory

Handle que IopOpenLinkOrRenameTarget utilise pour ouvrir le répertoire cible.

Si le fichier n’est pas déplacé vers un autre répertoire, ou si le membre FileName contient le chemin d’accès complet, ce membre a la valeur NULL. Sinon, il s’agit d’un handle pour le répertoire racine sous lequel le fichier réside après son renommage.

Pour effectuer deux opérations d’ouverture qui ne provoquent pas de conflit de partage, vous pouvez ouvrir RootDirectory en demandant une traversée | read-attribute. IopOpenLinkOrRenameTarget peut ensuite effectuer une ouverture relative en demandant FILE_WRITE_DATA | SYNCHRONISER. Ces deux ouvertures ne provoquent pas de conflit de partage.

FileNameLength

Longueur, en octets, du nouveau nom du fichier.

FileName[1]

Premier caractère d’une chaîne de caractères larges contenant le nouveau nom du fichier. Ceci est suivi en mémoire par le reste de la chaîne. Si le membre RootDirectory a la valeur NULL et que le fichier est déplacé vers un autre répertoire, ce membre spécifie le nom de chemin complet à affecter au fichier. Sinon, elle spécifie uniquement le nom de fichier ou un chemin d’accès relatif.

Remarques

La structure FILE_RENAME_INFORMATION est utilisée pour renommer un fichier. Cette opération peut être effectuée de l’une des manières suivantes :

  • Appelez FltSetInformationFile ou ZwSetInformationFile, en passant FileRenameInformation comme valeur de FileInformationClass et en transmettant une mémoire tampon allouée à l’appelant au format FILE_RENAME_INFORMATION structure pour la valeur de FileInformation. Le paramètre FileHandle spécifie le fichier à renommer.

  • Créez un IRP avec le code de fonction principal IRP_MJ_SET_INFORMATION.

Les minifiltres du système de fichiers doivent utiliser FltSetInformationFile, et non ZwSetInformationFile, pour renommer un fichier.

Le renommage d’un fichier nécessite l’accès DELETE au fichier afin que l’entrée de répertoire puisse être supprimée du répertoire parent actuel, ainsi que l’accès approprié pour créer l’entrée dans le nouveau fichier de répertoire parent.

La chaîne de nom de fichier dans le membre FileName doit être spécifiée dans l’un des formulaires suivants.

  • Nom de fichier simple. (Le membre RootDirectory est NULL.) Dans ce cas, le fichier est simplement renommé dans le même répertoire. Autrement dit, l’opération de renommage modifie le nom du fichier, mais pas son emplacement.

  • Nom de fichier complet. (Le membre RootDirectory est NULL.) Dans ce cas, l’opération de renommage modifie le nom et l’emplacement du fichier.

  • Nom de fichier relatif. Dans ce cas, le membre RootDirectory contient un handle dans le répertoire cible pour l’opération de renommage. Le nom de fichier lui-même doit être un nom de fichier simple.

Règles générales pour les opérations de renommage :

  • Un fichier ou un répertoire ne peut être renommé qu’au sein d’un volume. En d’autres termes, une opération de renommage ne peut pas entraîner le déplacement d’un fichier ou d’un répertoire vers un autre volume.

  • Impossible de renommer le répertoire racine d’un volume.

  • Si ReplaceIfExists a la valeur FALSE et que la cible existe, l’opération de renommage échoue.

  • Même si ReplaceIfExists a la valeur TRUE, l’opération de renommage échoue toujours si un fichier portant le même nom existe déjà et qu’il s’agit d’un répertoire, d’un fichier en lecture seule ou d’un fichier en cours d’exécution.

  • Les fichiers et répertoires d’un volume ne peuvent pas être renommés s’il s’agit d’un volume en lecture seule, tel qu’un volume CDFS ou un volume NTFS en lecture seule.

Règles spéciales pour renommer les fichiers ouverts :

  • Un fichier ne peut pas être renommé s’il a des descripteurs ouverts, sauf s’il est ouvert uniquement en raison d’un verrou opportuniste par lot (oplock) et que le verrouillage oplock de lot peut être cassé immédiatement.

  • Un fichier ne peut pas être renommé si un fichier portant le même nom existe et a des descripteurs ouverts (sauf dans le cas de batch-oplock décrit précédemment).

  • Un répertoire ne peut pas être renommé s’il ou l’un de ses sous-répertoires contient un fichier qui a des descripteurs ouverts (sauf dans le cas de batch-oplock décrit précédemment).

Règles spéciales pour renommer les flux de données NTFS :

  • Le flux de répertoire par défaut ne peut pas être renommé.

  • Le nouveau nom du flux doit commencer par un signe deux-points (:).

  • Un flux de données ne peut être renommé que dans le même fichier. En d’autres termes, une opération de renommage ne peut pas entraîner le déplacement d’un flux de données vers un autre fichier.

  • Un flux de données sur un répertoire ne peut pas être renommé en flux de données par défaut.

  • Si ReplaceIfExists est défini sur TRUE, l’opération de renommage réussit uniquement si un flux portant le même nom n’existe pas ou s’il s’agit d’un flux de données de longueur nulle.

  • « Renommer » le flux de données par défaut est autorisé, mais il ne s’agit pas d’un véritable renommage, car il laisse derrière lui un flux de données par défaut de longueur nulle.

La taille de la mémoire tampon FileInformation passée à ZwSetInformationFile ou FltSetInformationFile doit être >= sizeof(FILE_RENAME_INFORMATION) plus la taille en octets de la chaîne FileName .

Configuration requise

Condition requise Valeur
En-tête ntifs.h (include Ntifs.h, Fltkernel.h)

Voir aussi

FltSetInformationFile

IRP_MJ_SET_INFORMATION

ZwSetInformationFile