次の方法で共有


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 になります。 それ以外の場合は、ファイルの名前が変更された後に存在するルート ディレクトリのハンドルです。

共有の競合を引き起こさない 2 つのオープン操作を実行するには、走査を要求して RootDirectory を 開くことができます。 |read-attribute。 IopOpenLinkOrRenameTarget は、FILE_WRITE_DATA を要求することで相対オープンを実行できます。 |同期。 これら 2 つのオープンでは、共有の競合は発生しません。

FileNameLength

ファイルの新しい名前の長さ (バイト単位)。

FileName[1]

ファイルの新しい名前を含むワイド文字列の最初の文字。 その後、メモリ内で文字列の残りの部分が続きます。 RootDirectory メンバーが NULL で、ファイルが別のディレクトリに移動されている場合、このメンバーはファイルに割り当てる完全なパス名を指定します。 それ以外の場合は、ファイル名または相対パス名のみを指定します。

注釈

FILE_RENAME_INFORMATION構造体は、ファイルの名前を変更するために使用されます。 この操作は、次のいずれかの方法で実行できます。

  • FltSetInformationFile または ZwSetInformationFile を呼び出し、FileRenameInformationを FileInformationClass の値として渡し、FileInformation の値のFILE_RENAME_INFORMATION構造体として書式設定された呼び出し元によって割り当てられたバッファーを渡します。 FileHandle パラメーターは、名前を変更するファイルを指定します。

  • 主要な関数コード IRP_MJ_SET_INFORMATIONを使用して IRP を作成します。

ファイル システムミニフィルターでは、ファイルの名前を変更するには、 ZwSetInformationFile ではなく FltSetInformationFile を使用する必要があります。

ファイルの名前を変更するには、ディレクトリ エントリを現在の親ディレクトリから削除できるように、ファイルへの DELETE アクセスと、新しい親ディレクトリ ファイルに新しいエントリを作成するための適切なアクセス権が必要です。

FileName メンバーのファイル名文字列は、次のいずれかの形式で指定する必要があります。

  • 単純なファイル名。 ( RootDirectory メンバーは NULL です)。この場合、ファイルは単に同じディレクトリ内で名前が変更されます。 つまり、名前変更操作によってファイルの名前は変更されますが、その場所は変更されません。

  • 完全修飾ファイル名。 ( RootDirectory メンバーは NULL です)。この場合、名前変更操作によってファイルの名前と場所が変更されます。

  • 相対ファイル名。 この場合、 RootDirectory メンバーには、名前変更操作のターゲット ディレクトリへのハンドルが含まれます。 ファイル名自体は、単純なファイル名である必要があります。

名前変更操作の一般的な規則:

  • ファイルまたはディレクトリは、ボリューム内でのみ名前を変更できます。 つまり、名前の変更操作では、ファイルまたはディレクトリを別のボリュームに移動することはできません。

  • ボリュームのルート ディレクトリの名前を変更することはできません。

  • ReplaceIfExists が FALSE に設定されていて、ターゲットが存在する場合、名前の変更操作は失敗します。

  • ReplaceIfExists が TRUE に設定されていても、同じ名前のファイルが既に存在し、ディレクトリ、読み取り専用ファイル、または現在実行中のファイルである場合、名前変更操作は失敗します。

  • ボリュームが CDFS ボリュームや読み取り専用 NTFS ボリュームなどの読み取り専用ボリュームである場合、ボリュームのファイルとディレクトリの名前を変更できません。

開いているファイルの名前を変更するための特別な規則:

  • 開いているハンドルがある場合、ファイルの名前を変更することはできません。バッチの日和見ロック (oplock) が原因で開かれているだけで、バッチ oplock を直ちに壊すことができる場合を除きます。

  • 同じ名前のファイルが存在し、ハンドルが開いている場合は、ファイルの名前を変更できません (前述の batch-oplock の場合を除く)。

  • ディレクトリまたはそのサブディレクトリに開いているハンドルを含むファイルが含まれている場合、ディレクトリの名前を変更することはできません (前述の batch-oplock の場合を除く)。

NTFS データ ストリームの名前を変更するための特別な規則:

  • 既定のディレクトリ ストリームの名前を変更することはできません。

  • ストリームの新しい名前はコロン (:)で始まる必要があります。

  • データ ストリームの名前は、同じファイル でのみ変更できます。 つまり、名前変更操作では、データ ストリームを別のファイルに移動することはできません。

  • ディレクトリ上のデータ ストリームの名前を既定のデータ ストリームに変更することはできません。

  • ReplaceIfExists が TRUE に設定されている場合、名前の変更操作は、同じ名前のストリームが存在しないか、長さ 0 のデータ ストリームである場合にのみ成功します。

  • 既定のデータ ストリームの "名前変更" は許可されますが、長さが 0 の既定のデータ ストリームが残るため、これは真の名前変更ではありません。

ZwSetInformationFile または FltSetInformationFile に渡される FileInformation バッファーのサイズは、 >= sizeof(FILE_RENAME_INFORMATION) と FileName 文字列のバイト単位のサイズである必要があります。

要件

要件
Header ntifs.h (Ntifs.h、Fltkernel.h を含む)

こちらもご覧ください

FltSetInformationFile

IRP_MJ_SET_INFORMATION

ZwSetInformationFile