共用方式為


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) 將檔案重新命名為新目錄時,隱藏與檔案記憶體保留標識符屬性相關的任何繼承規則。
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結構可用來重新命名檔案。 此作業可以透過下列任一方式執行:

  • 呼叫 FltSetInformationFileZwSetInformationFile,將 FileRenameInformation 傳遞為 FileInformationClass 的值,並傳遞格式化為 FileInformation 值的FILE_RENAME_INFORMATION結構呼叫端配置的緩衝區。 FileHandle 參數指定要重新命名的檔案。

  • 使用主要函式 程式碼建立 IRP IRP_MJ_SET_INFORMATION。

文件系統迷你篩選必須使用 FltSetInformationFile,而不是 ZwSetInformationFile 來重新命名檔案。

重新命名檔案需要刪除檔案的存取權,才能從目前的父目錄移除目錄專案,以及適當的存取權,以便在新的父目錄檔案中建立新專案。

FileName 成員中的檔名字符串必須以下列其中一種形式指定。

  • 簡單的檔名。 (RootDirectory 成員為 NULL.) 在此情況下,檔案只會在相同的目錄中重新命名。 也就是說,重新命名作業會變更檔案的名稱,但不會變更其位置。

  • 完整檔名。 (RootDirectory 成員為 NULL.) 在此情況下,重新命名作業會變更檔案的名稱和位置。

  • 相對檔名。 在此情況下, RootDirectory 成員包含重新命名作業之目標目錄的句柄。 檔名本身必須是簡單的檔名。

重新命名作業的一般規則:

  • 檔案或目錄只能在磁碟區內重新命名。 換句話說,重新命名作業不會導致檔案或目錄移至不同的磁碟區。

  • 無法重新命名磁碟區的根目錄。

  • 如果 ReplaceIfExists 設定為 FALSE,且目標存在,則重新命名作業將會失敗。

  • 即使 ReplaceIfExists 設定為 TRUE,如果具有相同名稱的檔案已經存在且為目錄、唯讀檔案或目前正在執行的檔案,重新命名作業仍會失敗。

  • 如果磁碟區是唯讀磁碟區,例如CDFS磁碟區或唯讀NTFS磁碟區,則無法重新命名磁碟區的檔案和目錄。

重新命名開啟檔案的特殊規則:

  • 如果檔案具有任何開啟的句柄,則無法重新命名,除非檔案只會因為批次機會鎖定而開啟, (oplock) ,而且批次 oplock 可以立即中斷。

  • 如果具有相同名稱的檔案存在,而且有開啟句柄 (,則無法重新命名檔案,但稍早所述的 batch-oplock 案例) 除外。

  • 如果目錄或其任何子目錄包含開啟句柄的檔案 (,則目錄無法重新命名,但先前所述的批次作業案例) 除外。

重新命名NTFS資料流的特殊規則:

  • 無法重新命名預設目錄數據流。

  • 數據流的新名稱開頭必須是冒號 (:) 。

  • 數據流只能在相同的檔案 重新命名。 換句話說,重新命名作業不會導致數據流移至不同的檔案。

  • 目錄上的數據流無法重新命名為預設數據流。

  • 如果 ReplaceIfExists 設定為 TRUE,則只有在具有相同名稱的數據流不存在或長度為零長度的數據流時,重新命名作業才會成功。

  • 允許「重新命名」預設數據流,但這不是真正的重新命名,因為它會留下零長度的默認數據流。

傳遞至 ZwSetInformationFile 或 FltSetInformationFileFileInformation 緩衝區大小必須是 >= sizeof (FILE_RENAME_INFORMATION) 加上 FileName 字元串位元組的大小。

規格需求

需求
標頭 ntifs.h (包含 Ntifs.h、Fltkernel.h)

另請參閱

FltSetInformationFile

IRP_MJ_SET_INFORMATION

ZwSetInformationFile