2

我正在写(又一个)文件管理器(来学习东西:)并且有一个愚蠢/愚蠢的块。

在 Linux 上,要枚举可以包含文件的存储设备,我认为最好的方法是解析 /proc/partitions 文件的内容并提取 /dev/sda* 条目。(对吗?)但是,如何将 /dev/sda* 映射到我可以通过编程方式探索以获取目录内容的内容?我计划使用 boost/filesystem,但由于我不能 ls /dev/sda 我假设我不能使用 boost 来迭代它。

概要:如何将 /dev/sda* 转换为我可以“ls”的东西

4

3 回答 3

1

即兴发挥,我会说mount没有参数的输出可能是一个更快的选择。这应该会显示已安装的文件系统和设备,而 /proc 会显示所有设备和分区。

于 2012-04-17T20:48:12.337 回答
1

该设备/dev/sda*是块设备,需要挂载。为了能够做到ls这一点,您需要有一些可以解释文件系统类型的东西。第一步:识别文件系统类型,在原始代码中,硬盘驱动器第一段的分区表中通常有一个标头代码,这将是/dev/sda在 Linux 系统上,它类似于ext3

接下来,您需要编写或使用一个库来与该文件系统交互,如果您获得 Linux 的内核源代码,它有很多用于与通用文件系统交互的 API 代码,以及标准 POSIX 调用的包装器,这正是您所需要的重新寻找。诸如使用系统调用来检索有关已安装文件系统的信息之类的事情lscwd磁盘是块(或有时是字符)设备,您需要能够与之交谈并使用相同的语言。

于 2012-04-17T20:53:14.450 回答
1

我认为您误解/dev/sd*了程序的实际含义。它们是设备而不是目录。您使用该mount命令告诉操作系统将设备“解释”为文件系统,并将其附加到某个位置(root 或其他)。正是这一步使它成为文件系统某处的“目录”。因此,除了原始 I/O 命令(您不想这样做)之外,安装文件系统,然后尝试探索它。

这有点像打开一个文件。当你这样做时,操作系统会为你的程序提供一个字节流,你可以通过它随机访问文件。但是在磁盘上,该文件实际上可能分散在整个硬盘驱动器(或任何设备)上。但是操作系统正在将其“制作”成一种“不错”的格式,让您可以透明地处理。访问目录/文件列表时,磁盘本身也是如此。

我希望我的示例更清楚地说明了为什么您要尝试做的事情并不像您想象的那么简单。

于 2012-04-17T20:54:57.817 回答