c++ - NT 文件系统上非常小的文件上的 FSCTL_GET_RETRIEVAL_POINTERS 失败

标签 c++ delphi winapi filesystems ntfs

我的问题是:如果这个文件(非常重要)很小(小于一个簇,只有几个字节),如何获取文件磁盘偏移量。

目前我使用这个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++ 示例或示例也将受到赞赏。

最佳答案

该文件可能是常驻文件,这意味着它的数据足够小,可以放入其 MFT 条目中。请参阅此处以获得稍长的描述:

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

因此,您基本上需要找到 MFT 条目的位置才能知道数据在磁盘上的位置。你控制这个文件吗?如果是这样,最简单的方法是确保它始终大于 MFT 条目的大小(不是记录值,但您始终可以只执行 4K 或其他值)。

关于c++ - NT 文件系统上非常小的文件上的 FSCTL_GET_RETRIEVAL_POINTERS 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8682960/

相关文章:

c++ - 通过Tor服务的C++ socket.io客户端

delphi - 如何从 Bits 数组创建 Bitmap32?

c++ - 如何正确销毁窗口?

C Win32 API : Update Edit box when finished editting

c++ - std::search on single-pass 范围

c++ - 尝试添加数组元素给出零

c++ - 无法在我的 Qt 应用程序中启用 GLSL 1.40

Delphi:TPanel 和文本缩进

delphi - 了解消息处理过程的堆栈跟踪

python - 当我与远程桌面断开连接时,PyKeyboard.tap_key() 不起作用