共用方式為


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 作為 fileInformation Class 的值,並傳遞格式化為 fileInformation值之 FILE_RENAME_INFORMATION 結構的呼叫端配置緩衝區。 FileHandle 參數會指定要重新命名的檔案。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 如果目錄或其任何子目錄包含具有開啟句柄的檔案,則無法重新命名目錄(除了稍早所述的 batch-oplock 案例除外)。

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

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

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

  • 數據流只能在相同檔案內重新命名 。 換句話說,重新命名作業無法讓數據流移至不同的檔案。

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

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

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

傳遞 至 ZwSetInformationFileFltSetInformationFileFileInformationFile 緩衝區的大小必須 >= sizeof(FILE_RENAME_INFORMATION) 加上 fileName 字串 的字節大小。

要求

要求 價值
標頭 ntifs.h (include Ntifs.h, Fltkernel.h)

另請參閱

FltSetInformationFile

IRP_MJ_SET_INFORMATION

ZwSetInformationFile