Поделиться через


структура FILE_RENAME_INFORMATION (ntifs.h)

Структура FILE_RENAME_INFORMATION используется для переименования файла.

Синтаксис

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;

Члены

DUMMYUNIONNAME

DUMMYUNIONNAME.ReplaceIfExists

Задайте значение TRUE, чтобы указать, что если файл с заданным именем уже существует, его следует заменить указанным файлом. Установите значение FALSE, если операция переименования должна завершиться ошибкой, если файл с заданным именем уже существует.

DUMMYUNIONNAME.Flags

Флаги для операции переименования. Это поле применимо только при использовании с классом сведений FileRenameInformationEx .

Возможные значения

Значение Значение
FILE_RENAME_REPLACE_IF_EXISTS (0x00000001) Если файл с указанным именем уже существует, его следует заменить указанным файлом. Эквивалент поля ReplaceIfExists, используемого с информационным классом FileRenameInformation.
FILE_RENAME_POSIX_SEMANTICS (0x00000002) Если FILE_RENAME_REPLACE_IF_EXISTS также указан, разрешите замену файла, даже если для него существуют дескрипторы. Существующие дескрипторы для замененного файла по-прежнему допустимы для таких операций, как чтение и запись. При любом последующем открытии целевого имени открывается переименованный файл, а не замененный файл.
FILE_RENAME_SUPPRESS_PIN_STATE_INHERITANCE (0x00000004) При переименовании файла в новый каталог отключите все правила наследования, связанные с FILE_ATTRIBUTE_PINNED и атрибутами FILE_ATTRIBUTE_UNPINNED файла.
FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE (0x00000008) При переименовании файла в новый каталог отключите все правила наследования, связанные со свойством идентификатора резерва хранилища файла.
FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE (0x00000010) Если FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE также не указан, при переименовании файла в новый каталог автоматически измените размер затронутых резервных областей хранилища, чтобы предотвратить увеличение видимого пользователем свободного места на томе. Требуется управление доступом к томам.
FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE (0x00000020) Если FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE также не указан, при переименовании файла в новый каталог автоматически измените размер затронутых областей резервирования хранилища по мере необходимости, чтобы предотвратить уменьшение свободного места на томе. Требуется управление доступом к томам.
FILE_RENAME_PRESERVE_AVAILABLE_SPACE (0x00000030) Эквивалентно указанию FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE и FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE.
FILE_RENAME_IGNORE_READONLY_ATTRIBUTE (0x00000040) Если также указан FILE_RENAME_REPLACE_IF_EXISTS, разрешите замену файла, даже если он доступен только для чтения. Требуется WRITE_ATTRIBUTES доступ к замененным файлу.
FILE_RENAME_FORCE_RESIZE_TARGET_SR (0x00000080) Если FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE также не указан, при переименовании файла в новый каталог, который является частью другой резервной области хранения, всегда увеличивает резервную область хранения целевого каталога на полный размер переименовываемого файла. Требуется управление доступом к томам.
FILE_RENAME_FORCE_RESIZE_SOURCE_SR (0x00000100) Если FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE также не указан, при переименовании файла в новый каталог, который является частью другой резервной области хранения, всегда сжимайте резервную область хранения исходного каталога на полный размер переименовываемого файла. Требуется управление доступом к томам.
FILE_RENAME_FORCE_RESIZE_SR (0x00000180) Эквивалентно указанию FILE_RENAME_FORCE_RESIZE_TARGET_SR и FILE_RENAME_FORCE_RESIZE_SOURCE_SR.

ReplaceIfExists

Задайте значение TRUE, чтобы указать, что если файл с заданным именем уже существует, его следует заменить указанным файлом. Установите значение FALSE, если операция переименования должна завершиться ошибкой, если файл с заданным именем уже существует.

RootDirectory

Дескриптор, который IopOpenLinkOrRenameTarget использует для открытия целевого каталога.

Если файл не перемещается в другой каталог или элемент FileName содержит полный путь, этот элемент имеет значение NULL. В противном случае это дескриптор корневого каталога, в котором будет находиться файл после переименования.

Чтобы выполнить две открытые операции, которые не вызовут конфликта общего доступа, можно открыть RootDirectory , запросив обход | read-attribute. IopOpenLinkOrRenameTarget может выполнить относительное открытие, запросив FILE_WRITE_DATA | СИНХРОНИЗИРОВАТЬ. Эти два открытия не вызовут конфликта общего доступа.

FileNameLength

Длина (в байтах) нового имени файла.

FileName[1]

Первый символ строки расширенных символов, содержащей новое имя файла. За этим в памяти следует остаток строки. Если элемент RootDirectory имеет значение NULL и файл перемещается в другой каталог, этот элемент задает полный путь к файлу. В противном случае указывается только имя файла или относительный путь.

Комментарии

Структура FILE_RENAME_INFORMATION используется для переименования файла. Эту операцию можно выполнить следующими способами:

  • Вызовите FltSetInformationFile или ZwSetInformationFile, передав FileRenameInformation в качестве значения FileInformationClass и передав буфер, выделенный вызывающим объектом, в формате FILE_RENAME_INFORMATION структуры для значения FileInformation. Параметр FileHandle указывает файл для переименования.

  • Создайте IRP с основным кодом функции IRP_MJ_SET_INFORMATION.

Минифильтры файловой системы должны использовать FltSetInformationFile, а не ZwSetInformationFile для переименования файла.

Для переименования файла требуется доступ DELETE к файлу, чтобы запись каталога можно было удалить из текущего родительского каталога, а также соответствующий доступ для создания новой записи в новом файле родительского каталога.

Строка имени файла в элементе FileName должна быть указана в одной из следующих форм.

  • Простое имя файла. (Элемент RootDirectory имеет значение NULL.) В этом случае файл просто переименовывается в том же каталоге. То есть операция переименования изменяет имя файла, но не его расположение.

  • Полное имя файла. (Элемент RootDirectory имеет значение NULL.) В этом случае операция переименования изменяет имя и расположение файла.

  • Относительное имя файла. В этом случае элемент RootDirectory содержит дескриптор целевого каталога для операции переименования. Имя файла должно быть простым.

Общие правила для операций переименования:

  • Файл или каталог можно переименовать только в томе. Другими словами, операция переименования не может привести к перемещению файла или каталога в другой том.

  • Корневой каталог тома не может быть переименован.

  • Если параметр ReplaceIfExists имеет значение FALSE, а целевой объект существует, операция переименования завершится ошибкой.

  • Даже если для ReplaceIfExists задано значение TRUE, операция переименования по-прежнему завершится ошибкой, если файл с тем же именем уже существует и является каталогом, файлом только для чтения или текущим исполняемым файлом.

  • Файлы и каталоги тома нельзя переименовать, если том является томом только для чтения, например томом CDFS или томом NTFS только для чтения.

Специальные правила переименования открытых файлов:

  • Файл нельзя переименовать, если он имеет какие-либо открытые дескрипторы, если только он не открыт только из-за пакетной оппортунистической блокировки (oplock), и пакетная блокировка может быть немедленно нарушена.

  • Файл нельзя переименовать, если файл с таким же именем существует и имеет открытые дескрипторы (за исключением случая пакетной блокировки, описанного выше).

  • Каталог нельзя переименовать, если он или любой из его подкаталогов содержит файл с открытыми дескрипторами (за исключением случая batch-oplock, описанного выше).

Специальные правила для переименования потоков данных NTFS:

  • Невозможно переименовать поток каталога по умолчанию.

  • Новое имя потока должно начинаться с двоеточия (:).

  • Поток данных можно переименовать только в том же файле. Другими словами, операция переименования не может привести к перемещению потока данных в другой файл.

  • Поток данных в каталоге нельзя переименовать в поток данных по умолчанию.

  • Если параметр ReplaceIfExists имеет значение TRUE, операция переименования будет выполнена успешно, только если поток с тем же именем не существует или является потоком данных нулевой длины.

  • "Переименование" потока данных по умолчанию разрешено, но это не является истинным переименованием, так как он оставляет поток данных нулевой длины по умолчанию.

Размер буфера FileInformation, передаваемого в ZwSetInformationFile или FltSetInformationFile , должен быть >= sizeof(FILE_RENAME_INFORMATION) плюс размер строки FileName в байтах.

Требования

Требование Значение
Заголовок ntifs.h (включая Ntifs.h, Fltkernel.h)

См. также раздел

FltSetInformationFile

IRP_MJ_SET_INFORMATION

ZwSetInformationFile