структура 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) |