ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:nick_2010 Master File Tableの更新と参照について
困り度:
  • 困っています
NTFSというファイルシステムは、MFT(Master File Table)というところで、ファイル名や作成日時などの属性を保持していると学びました。

エクスプローラでフォルダの中を表示したとき、ファイル名や更新日時が見えますが、MFTから読み込んでいると認識しています。

また、ファイルの中身を変更したとき、更新日時が更新されますが、これはMFTの内容が更新されていると考えています。

そこで疑問に思ったのですが、ファイルの更新とエクスプローラ(または他のプログラム)からのMFTの読み込みがちょうどタイミングよく重なったとき、どうなるのでしょうか?
うまくOSの方で制御していて書き込みまたは読み込みのどちらかが待つようになっているのか、それともどちらかがエラーするのでしょうか?

プログラムを作る上で少し気になったので質問させていただきました。
ご回答よろしくお願いします。
また、ここまでの記述の認識で間違っている部分があったら指摘してください。
質問投稿日時:10/02/26 23:38
質問番号:5709115
最新から表示回答順に表示

回答

 

回答者:yakan9 NTFSのファイルシステムや、MFTの構造、そのほか、LBLのこと、Microsoftの資料など、
広範囲に調査して理解していく必要があると思います。
MFTと呼ばれるものは、ユーザーファイルのトップに書き出される情報(56バイトとか)も含まれます。
管理テーブルとしてももちろん存在します。何か根本的に誤解しているような。
管理テーブル情報の一部は、ファイルの先頭にもコピーされているという概念ですけど。

一例として、
ファイルシステム
http://jiten.biglobe.ne.jp/j/84/a9/0c/5893b9e90d2d58887e0e80d465804...

NTFSファイルシステムの構造
http://iss.x0.com/software/useful/ntfs.html

NTFS でマスタ ファイル テーブル (MFT) 用の領域を予約する方法
http://support.microsoft.com/kb/174619/ja
種類:回答
どんな人:一般人
自信:参考意見
回答日時:10/03/02 20:32
回答番号:No.2
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼すばやい回答ありがとうございます!

また、わかりやすいリンク先を紹介していただき助かります。
おっしゃるとおり自分が書いてることにはあまり自信がありません。
まわりにそれほど詳しい人もいないですし…。

ファイル名とか更新日時とかがどこにあるのか検索していったらディレクトリエントリ(NTFSだとMFT)と出てきたのでそれに絞って質問させていただきました。

2個目のリンク先にも
(0x30) $FILE_NAME ←こんなのがありましたし。

また3つ目のリンク先に
>注 : dir コマンドで返される結果は、最新の値ではない場合があります。正常にシャットダウンされた後にシステムを起動したときの MFT のサイズが反映されているキャッシュ データが、dir コマンドで報告されるサイズに反映されることがあります。

というのがありましたが、ファイル情報の参照時や更新時のMFTの動作がわかればいいのかなと思いました。
詳しいサイト等ご存知でしたら教えていただけないでしょうか。
本でもいいです。

あと、私の知識不足でいろいろ間違っている部分があると思いますが、そこは遠慮なく指摘して下さい。
私が作ろうとしているのはVBScriptにより、FileSystemObjectのnameプロパティによりファイル名を取得しようとしています。

すぐに返信できないかもしれませんが、必ず拝見させていただきます!
ぜひぜひよろしくお願いします。

回答

 

回答者:yakan9 > ファイルの更新とエクスプローラ(または他のプログラム)からのMFTの読み込みがちょうど
> タイミングよく重なったとき、どうなるのでしょうか?
OSの方で、制御します。
ファイルアクセス制御といい、OSの基本機能です。
片方が終了したら通知しますかといったような選択もできます。
もしくは、読み込みだけであれば、可能ですよといったメッセージが出ると思います。
実験的に、wordで一つのファイルを開いておき、別なwordで同じファイルを開いてみるとすぐに分かります。

俗に、同期を取るとか、排他制御という言葉で表現します。
しかし、一つのファイルに関しては、OSの方で制御しますが、大きなシステム構築する場合は、
複数のファイルをアクセスする場合が発生し、もっと上のレベルで、同期管理をしないと、
デットロックが発生します。
システムエンジニアの仕事のシステムデザイン時には、このファイル関連図というものを作成し、
デットロックが発生しないような、仕組みを作るのが大事な要素となります。

WEB検索する場合は、「ファイルの排他制御」、もっと専門的には、「Enqueue/Dequeue」といった専門用語になってきます。
種類:回答
どんな人:一般人
自信:参考意見
回答日時:10/02/27 14:58
回答番号:No.1
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼回答ありがとうございます。

私の方も少し説明不足だったため、若干教えていただきたい内容とずれがあったように思いますので再度詳細を書きたいと思います。

私がお聞きしたかったのは、ファイル更新時にはファイル更新日時も更新されるため、MFTの情報も更新されると思われますが、そのときにタイミングよくMFTの参照もされる場合、うまく制御されておりエラーしないのか、もっと言えば、プログラム作成時に気にしなくてよいのかということなのです。

ファイル本体を読み書きする場合は、ロックするなり排他制御する必要があると思うのですが、MFT(やディレクトリエントリ)のところは特に何もしなくてもいいのでしょうか。(というより何かする関数等は無い様な気もしますが…)

私が作りたいプログラムは、フォルダ内を検索して該当のファイル名のファイルを探してコピーするものです。
そのフォルダは市販のソフトのフォルダであり、いつどのファイルを使っているかわからないため、私のプログラムでファイル属性の参照をしている時に市販のソフト側でファイルをオープンしているかもしれません。
ファイル属性の参照が何の影響も及ぼさないのかどうか気になっています。
ちなみにコピーしようとしているファイルはログであり、ログができるタイミングでは実行しないようにするので、コピー部分は気にしていません。

よろしくお願いします。
最新から表示回答順に表示