如何获得C / C ++中文件的磁盘地址?

问题描述 投票:0回答:2

当文件保存到驱动器中时,将写入其内容,然后对其进行索引。我想获取索引并访问文件的原始内容。

关于该方法的任何想法,特别是对于ex4和btrfs而言如何?

更新:我想获取文件范围的地址。有关地址的信息必须存储在磁盘上的某个位置。我想检索此信息,以便映射文件内容的物理位置。有什么方法可以达到目的?

更新:大家好!感谢您的答复。我想要的是一个函数/命令,它会向我返回扩展区地址的列表。 debugfs似乎是功能/命令具有最相关的功能。

c filesystems ext4 btrfs
2个回答
0
投票

取决于您使用的文件系统。如果您正在运行Linux,则可以使用debufs在文件系统中查找文件。

我不得不说,所有FS都是通过VFS挂载的,VFS是一种虚拟文件系统,类似于具有标准操作(打开,关闭,读取...)的简化接口。那是什么意思?没有文件系统或其内容(文件,目录)直接从磁盘打开,当您打开某些内容时,将其移至主内存(您的RAM)中进行操作,而当您关闭某些内容时,它将返回至磁盘驱动器。

现在,问题是:我可以在FS中获得绝对地址吗?是的,如果您像open ("/dev/sdaX", 0_RDONLY);这样打开整个文件系统,则可以使用C中的lseek获得相对于文件系统的地址。

然后...我能在整个驱动器中得到相同的吗?不,这是因为您不能将整个驱动器作为文件描述符打开。还记得UNIX中的/dev/sdaX吗?分区及其分区可以像文件一样打开,因为它们具有运行于其上的虚拟接口。

您的最后一个答案:我可以阅读真正的原始内容吗?所有文件都按照它们在磁盘上显示的方式进行读取,唯一改变的是操作系统使用的描述符以及有关如何编制索引的一些数据,所有这些都作为“文件头”。

希望您的所有问题都能得到答复。


0
投票

当前解决方案/解决方法是使用popen调用这些函数:

filefrag -e / path / to / file

hdparm --fibmap / path / to / filename

然后应该简单地解析这些程序的字符串输出。这不是一个真正的解决方案(即:C / C ++级别的输出),但是我现在会接受。

来源:

https://unix.stackexchange.com/questions/106802/what-command-do-i-use-to-see-the-start-and-end-block-of-a-file-in-the-file-syste

https://serverfault.com/questions/29886/how-do-i-list-a-files-data-blocks-on-linux

© www.soinside.com 2019 - 2024. All rights reserved.