2011-12-30 5 views
1

私の質問は、このファイル(非常に重要)が小さい(1クラスタ未満、わずか数バイト)場合、ファイルディスクオフセットを取得する方法です。NTファイルシステム上の非常に小さなファイルでFSCTL_GET_RETRIEVAL_POINTERSエラーが発生しました

現在、私は、このWindows API関数を使用します。

DeviceIOControl(FileHandle, FSCTL_GET_RETRIEVAL_POINTERS, @InBuffer, SizeOf(InBuffer), @OutBuffer, SizeOf(OutBuffer), Num, Nil); 
FirsExtent.Start := OutBuffer.Pair[0].LogicalCluster ; 

それはクラスタよりも大きいファイルを完璧に動作しますが、それは常にオフセットヌルを返すよう、それだけで、小さなファイルで失敗します。

小さなファイルではどのような手順を実行しますか? NTFSボリューム上のどこに配置されていますか?ファイルのオフセットを知る別の方法がありますか?この細分性はどこにも書かれていないようです。

注:質問はDelphiとしてタグ付けされていますが、C++のサンプルや例も同様に評価されます。

+0

サポートされているファイルシステムでは、FSCTL_GET_RETRIEVAL_POINTERS操作では、非居住者データのエクステントの場所が返されます。常駐データにはエクステントの場所が決してありません。 – wj32

+0

ああ、私は迷惑な質問をする衝動を感じる "なぜ?" – OnTheFly

+0

":"私の16進エディタにディスクエディタがあり、特別なファイルエクスプローラ(DeviceIOControlを使用)と組み合わせて、ボリューム編集時に何を編集しているかを知ることができます(cf. http://www.iceberg-softwares .com/blog/index.php?カテゴリ= 1) – az01

答えて

4

ファイルはおそらく常駐しているため、そのデータはMFTエントリに収まるくらい小さいものです。やや長めの説明についてはこちらをご覧ください:

http://www.disk-space-guide.com/ntfs-disk-space.aspx

ですから、基本的にはデータがディスク上にある場所を知るために、MFTエントリの場所を見つける必要があると思います。このファイルを管理していますか?もしそうなら、最も簡単なことは、文書化された値ではなくMFTのエントリーのサイズよりも常に大きいことを確認することですが、常に4Kか何かを行うことができます。

関連する問題