でハードリンクとジャンクションMSDN の記事では次のことが読めます:
ハード リンクは、複数のパスが同じボリューム内の 1 つのファイルを参照するファイルのファイル システム表現です。ハード リンクを作成するには、CreateHardLink 関数を使用します。そのファイルへの変更は、それを参照するハード リンクを介してアクセスするアプリケーションに即座に表示されます。ただし、ディレクトリ エントリのサイズと属性情報は、変更が行われたリンクに対してのみ更新されます。ファイルの属性はそのファイルへのすべてのハード リンクに反映され、そのファイルの属性の変更はすべてのハード リンクに伝播されることに注意してください。たとえば、特定のハード リンクを削除するためにハード リンクの READONLY 属性をリセットし、実際のファイルへのハード リンクが複数ある場合は、残りのハード リンクの 1 つからファイルの READONLY ビットをリセットして、ファイルと残りのすべてのハード リンクを READONLY 状態に戻す必要があります。
上記の段落の意味を理解できる人はいますか
?ファイルの属性は、そのファイルへのすべてのハードリンクに反映されます。文と同等であるそのファイルの属性の変更はすべてのハードリンクに伝播します?
どうしてリセットREADONLYビットはファイルと残りのすべてのハードリンクをREADONLY状態に戻します。?
編集
この質問に対する JdeBP の優れた回答を読んだ後も、まだ疑問が残っています。
$STANDARD_INFORMATION
回答によると、このエントリを指す各ハードリンクにはMFTのエントリの部分的なコピーがあるようです。ハードリンクの名前が変更されたり、作成または破棄されない限り、最新の状態に保たれないハードリンクの属性を読み取ると何が起こりますか? このハードリンクのコピーは$STANDARD_INFORMATION
現在の状態を反映していない可能性があるため無視され、属性は MFT のエントリのから直接読み取られると思います$STANDARD_INFORMATION
。さらに、このプロセス中は、リストした操作のいずれでもないため、情報は更新されません。そうなのですか?
ファイルへのハード リンクを削除できるようにするために R ビットをオフに設定した場合、(それが最後のリンクではなかったと仮定して) ファイルを再び読み取り専用にするには、何らかの方法で R ビットを再度オンに設定する必要があります。
さて、私はそれが最後のリンクではなかったと仮定すると部分。リンクが最後にあることで、ここで何か違いが生じるとは思えません。ファイル (MFT のエントリ) 自体はまだ存在し、その属性を直接変更できます (リンク経由ではありません)。または、ファイルがある場合はリンクが存在するため、MFT のエントリとファイルの間に 1 対 1 の対応関係がないということでしょうか。
答え1
おっしゃるとおりgrawity
、2 回目の「リセット」は書き方が下手か、まったくの間違いです。
この声明はファイルの属性は、そのファイルへのすべてのハードリンクに反映されます。文と同等であるそのファイルの属性の変更はすべてのハードリンクに伝播します?
いいえ。この記事は、対象読者にとって実装の詳細が多すぎるかもしれないことを述べています。NTFSでは、MFTの各エントリには0個以上の$FILE_NAME
属性これらは、ファイルへのハードリンクごとに親ディレクトリとそのディレクトリ内の名前を記録します。しかし、またレコードファイル属性フラグ、それでもこれらのフラグは、MFT エントリの単一の$STANDARD_INFORMATION
属性に記録されます。ルールはやや複雑ですが、簡単に言えば$STANDARD_INFORMATION
重要なことであり、$FILE_NAME
ハード リンクの名前変更、作成、または破棄が行われない限り、情報は最新の状態に保たれません。これには属性への変更が必要であり$FILE_NAME
、現在の属性フラグを属性に伝播できるポイントも変更する必要があります$FILE_NAME
。
開発者は、MSDNの記事を書いた技術著者にNTFSの詳細な説明をしたかもしれません。しかし、それらは実際にはエンドユーザーやアプリケーションプログラマーにはまったく関係がありません。これらはNTFSがどのように動作するかの内部的な詳細です。Win32の観点からは、ファイル/ディレクトリはまさに1つ属性フラグのセットであり、それを更新することは、それがどのように行われたかにかかわらず、それを更新することです。ファイルへのハードリンクを削除できるようにするためにビットをオフに設定した場合、(それが最後のリンクではなかったと仮定して)ファイルを再び読み取り専用にするには、どのような方法でもビットを再びオンに設定するR
必要があります。R