ファイル ストリーム (ローカル ファイル システム)

ストリームとはバイトのシーケンスです。 NTFS ファイル システムでは、ストリームに、ファイルに書き込まれるデータが含まれていて、属性やプロパティよりも詳細な、ファイルに関する情報をもたらします。 たとえば、検索キーワードを含むストリームや、ファイルを作成するユーザー アカウントの ID を作成できます。

ファイルに関連付けられている各ストリームには、それ自体の割り当てサイズ、実際のサイズ、および有効なデータ長があります。

  • 割り当てサイズは、ストリーム用に予約されているディスク領域の量です。
  • 実際のサイズは、呼び出し元によって使用されているバイト数です。
  • 有効なデータ長 (VDL) は、ストリームの割り当てサイズから初期化されるバイト数です。

各ストリームは、圧縮、暗号化、スパース性のためにそれ自体の状態の維持も行います。 ファイルの FILE_ATTRIBUTE_SPARSE_FILE 属性は、FindFirstFileFindFirstFileExFindNextFile 関数から返される WIN32_FIND_DATA 構造体の dwFileAttributes メンバーで設定されます (いずれかのストリームがスパースになっている場合)。 GetFileAttributesGetFileAttributesExGetFileAttributesTransactedGetFileInformationByHandle、および GetFileInformationByHandleEx は、ストリームが指定されていない場合、既定のデータ ストリームのスパース状態を返します。

ストリームに関連付けられているファイル時刻はありません。 ファイル内のストリームが更新されると、ファイルのファイル時刻が更新されます。

日和見ロックはストリームごとに保守されます。 共有モードもストリームごとに保守されます。 ファイルに対して削除アクセスが要求されると、オペレーティング システムは、ファイル内のすべての開いているストリームに対する削除アクセス権を確認します。 別のプロセスが FILE_SHARE_DELETE アクセス許可なしでストリームを開いた場合、削除アクセス権のためにファイルを開くことはできません。

コピーされるファイルにデータ ストリームがあり、ネットワーク リダイレクターが使用されている場合、クライアントに読み取りアクセス許可と属性の読み取りアクセス許可の両方がある場合にのみ、ファイルをコピーできます。

ストリームの名前付け規則

Windows シェル コマンド ラインから指定すると、ストリームの完全な名前は "filename:stream name:stream type" になります。例: "myfile.dat:stream1:$DATA"。

ファイル名で有効な文字は、ストリーム名でも有効です (スペースを含む)。 詳細については、ファイルの名前つけに関する記事を参照してください。 ストリームの種類 (属性の種類コードとも呼ばれます) は、NTFS ファイル システムの内部にあります。 そのため、ユーザーは新しいストリームの種類を作成できませんが、既存の NTFS ファイル システムの種類を開くことができます。 ストリームの種類指定子の値は、常にドル記号 ($) 記号で始まります。 ストリームの種類の一覧については、以下を参照してください。

既定では、既定のデータ ストリームには名前がありません。 既定のデータ ストリームを完全に指定するには、"filename::$DATA" を使用します。ここで、$DATAはストリームの種類です。 これは "filename" と等価です。 ファイルの名前付け規則を使用して、ファイルに名前付きストリームを作成できます。 "$DATA" は有効なストリーム名であることに注意してください。 たとえば、"sample" という名前のファイルの "$DATA" という名前のストリームの完全な名前は、"sample:$DATA:$DATA" になります。 同じファイルに "bar" という名前のストリームを作成した場合、完全な名前は "sample:bar:$DATA" になります。

1 文字の名前を持つファイルを作成して操作するときは、ファイル名の先頭にピリオドと、それに続く円記号 (.) を付けるか、完全修飾パス名を使用します。 これを行うのは、Windows が 1 文字のファイル名をドライブ文字として扱うためです。 相対パスでドライブ文字を指定すると、ドライブ文字とパスがコロンで区切られます。 1 文字の名前がドライブ文字であるかファイル名であるかがあいまいなとき、Windows は、ドライブ文字が無効であっても、コロンの後の文字列が有効なパスである場合は、ドライブ文字であると見なします。

ストリームの種類

NTFS ストリームの種類 (属性の種類コードとも呼ばれます) の一覧を次に示します。 一部のストリームの種類は NTFS の内部であり、その形式は文書化されていません。

ストリームの種類 説明
::$ATTRIBUTE_LIST ファイルを構成し、各属性が配置されている場所を識別するすべての属性の一覧が含まれます。
::$BITMAP ディレクトリの B ツリーの空き領域を管理するためにインデックスによって使用されるビットマップ。 B ツリーは (クラスター サイズに関係なく) 4 KB のチャンクで管理され、これは、これらのチャンクの割り当てを管理するために使用されます。 このストリームの種類は、すべてのディレクトリに存在します。
::$DATA データ ストリーム。 既定のデータ ストリームには名前がありません。 データ ストリームは、FindFirstStreamWFindNextStreamW 関数を使用して列挙できます。
::$EA 拡張属性データが含まれます。
::$EA_INFORMATION 拡張属性に関するサポート情報が含まれます。
::$FILE_NAME ファイルの名前 (Unicode 文字)。 これには、ファイルの短い名前とハード リンクが含まれます。
::$INDEX_ALLOCATION ディレクトリのストリームの種類。 大きなディレクトリのファイル名の割り当てを実装するために使用されます。 このストリームはディレクトリ自体を表し、ディレクトリのすべてのデータを格納します。 この種類のストリームに対する変更は、NTFS 変更ジャーナルに記録されます。 $INDEX_ALLOCATION ストリームの種類の既定のストリーム名は $I30 であるため、"DirName"、"DirName::$INDEX_ALLOCATION"、"DirName:$I30:$INDEX_ALLOCATION" はすべて等価です。
::$INDEX_ROOT このストリームは、インデックスの B ツリーのルートを表します。 このストリームの種類は、すべてのディレクトリに存在します。
::$LOGGED_UTILITY_STREAM ::$DATA に似ていますが、操作が NTFS 変更ジャーナルに記録されます。 EFS および トランザクション NTFS (TxF) で使用されます。 EFS の場合の ":StreamName:$StreamType" ペアは ":$EFS:$LOGGED_UTILITY_STREAM" で、TxF の場合は ":$TXF_DATA:$LOGGED_UTILITY_STREAM" です。
::$OBJECT_ID リンク追跡サービスのファイルを識別するために使用される 16 バイトの ID。
::$REPARSE_POINT 再解析ポイント データ。

 

ストリームの使用