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) | 如果已存在具有给定名称的文件,则应将其替换为给定文件。 等效于与 FileRenameInformation 信息类一起使用的 ReplaceIfExists 字段。 |
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) | 将文件重命名为新目录时,禁止显示与文件存储保留 ID 属性相关的任何继承规则。 |
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 作为 fileInformation Class 的值传递,并将格式化为 FileInformation值的调用方分配的缓冲区作为 FILE_RENAME_INFORMATION 结构传递。 FileHandle 参数指定要重命名的文件。
使用主要函数代码 IRP_MJ_SET_INFORMATION创建 IRP。
文件系统微型筛选器必须使用 FltSetInformationFile(而不是 ZwSetInformationFile)重命名文件。
重命名文件需要对文件具有 DELETE 访问权限,以便可以从当前父目录中删除目录条目,并具有在新的父目录文件中创建新条目的适当访问权限。
FileName 成员中的文件名字符串必须在以下表单之一中指定。
一个简单的文件名。 (RootDirectory 成员为 NULL。在这种情况下,文件只是在同一目录中重命名。 也就是说,重命名作会更改文件的名称,但不会更改其位置。
完全限定的文件名。 (RootDirectory 成员为 NULL。在这种情况下,重命名作将更改文件的名称和位置。
相对文件名。 在这种情况下,RootDirectory 成员包含重命名作的目标目录的句柄。 文件名本身必须是简单的文件名。
重命名作的常规规则:
只能在卷中重命名文件或目录。 换句话说,重命名作不能使文件或目录移动到其他卷。
无法重命名卷的根目录。
如果 ReplaceIfExists 设置为 FALSE,并且目标存在,则重命名作将失败。
即使 ReplaceIfExists 设置为 TRUE,如果已存在同名的文件并且是目录、只读文件或当前正在执行的文件,则重命名作仍将失败。
如果卷是只读卷(例如 CDFS 卷或只读 NTFS 卷),则无法重命名卷的文件和目录。
重命名打开的文件的特殊规则:
如果文件具有任何打开的句柄,则无法重命名该文件,除非它只是因为批处理机会锁(oplock)而打开,并且批处理作锁可以立即中断。
如果存在同名文件并且具有打开句柄(前面所述的批处理作例除外),则无法重命名文件。
如果目录或其任何子目录包含打开句柄的文件(前面所述的批处理作案例除外),则无法重命名目录。
重命名 NTFS 数据流的特殊规则:
无法重命名默认目录流。
流的新名称必须以冒号开头(:))。
只能在同一文件中 重命名数据流。 换句话说,重命名作不能导致数据流移动到其他文件。
无法将目录上的数据流重命名为默认数据流。
如果 ReplaceIfExists 设置为 TRUE,则仅当同名流不存在或长度为零的数据流时,重命名作才会成功。
允许“重命名”默认数据流,但这不是真正的重命名,因为它留下了零长度的默认数据流。
传递给 ZwSetInformationFile 或 FltSetInformation File 的 fileInformation 缓冲区的大小必须 >= sizeof(FILE_RENAME_INFORMATION) 加上 FileName 字符串的大小(以字节为单位)。
要求
要求 | 价值 |
---|---|
标头 | ntifs.h(包括 Ntifs.h、Fltkernel.h) |