【问题标题】:File table in Ubuntu OSUbuntu 操作系统中的文件表
【发布时间】:2012-10-19 12:18:14
【问题描述】:

linux/Ubuntu OS 是否会创建一个表来保存每个文件的条目及其存储在硬盘上的绝对地址?

只是想知道,因为我正计划制作一个文件搜索程序。

我知道有诸如 find 之类的终端命令,但是由于我将在 C 中编程,所以我在想 Ubuntu 操作系统是否有这样的事情,如果有,我该如何访问该表?

更新:

正如有些人所说没有这样的东西,那么如果我想制作一个文件搜索程序,我将不得不搜索每个目录的每个文件夹,从程序根目录开始。生成的程序将非常缓慢并且性能很差!那么有没有更好的方法呢?还是我的方式好!

【问题讨论】:

  • Ubuntu 不是操作系统,它是 Linux 发行版,发帖前请检查您的知识。
  • 你可以在 C 中搜索 python 的 os.walk 等价物。
  • @Griwes:GNU/Linux 发行版操作系统...
  • @David,放弃GNU/ 废话。 Ubuntu 是“Ubuntu”,而不是“Ubuntu OS”,这是重点。这个论点的其余部分将是关于一个人的生活哲学,因此毫无意义。再说一遍:它是“Ubuntu”,而不是“Ubuntu OS”。

标签: c++ linux ubuntu filetable


【解决方案1】:

您所描述的“事物”通常称为文件系统,并且您可能知道有多种可用于 Linux 的文件系统:ext3、ext4、btrfs、Reiser、xfs、jffs 等。

您描述的表可能会很好地映射到 inode-directory 组合。

在我看来,文件在硬盘上的物理位置的整个管理与用户无关,它严格来说是操作系统的域,除非你有一个很好的借口(比如你'重新编写数据恢复程序)和所涉及的文件系统的非常深入的知识。此外,在大多数情况下,文件的存储空间将连续,而是分布在磁盘上的多个位置(片段)。

但这里更重要的问题可能是:通过这种方式查找文件,您究竟希望达到什么目的?

编辑:根据 OP 的评论,我认为这里可能存在严重的误解 - 我看不到绝对文件地址和文件搜索器之间的联系,但这可能是由于我们各自对“绝对地址”在文件系统的上下文中。

如果你只想查看文件系统中的所有文件,你可以

  1. 执行递归目录读取或
  2. 按照SmartGuyz的建议使用updatedb准备的数据库

因为您无论如何都想查看文件 - 这就是几乎所有运行时都将用于的地方 - 我想不出任何优势 2) 会超过 1) 并且 2) 具有外部依赖的劣势, 以防updatedb准备的文件必须存在并且非常新鲜。

一个关于遍历目录的方法比旧的 opendir/readdir/closedir 更高级的问题:Efficiently Traverse Directory Tree with opendir(), readdir() and closedir()

EDIT2 基于 OP 的问题附录:是的,遍历目录需要时间,但这就是生命。考虑下一个最好的事情,即定位和朋友。它依赖于将定期更新(通常每天一次)的“数据库”,因此将找不到在上次计划更新之后添加或重命名的所有文件,并且在最后计划的更新将在数据库中提及,尽管它们不再存在。假设即使在目标计算机上安装了 locate,您也无法确定。

与编程中的大多数事情一样,查看以前对同一问题的解决方案永远不会有什么坏处,所以我可以建议您阅读GNU findutils 的文档吗?

【讨论】:

  • 我在问题中提到我想将文件搜索器程序作为一个项目!
【解决方案2】:

不,没有文件块地址的单一表,您需要更深入。

首先,文件布局取决于文件系统类型(例如 ext2、ext3、btrfs.reisersf、jfs、xfs 等)。这是由 Linux 内核抽象的,它提供了用于访问许多文件系统上的文件的驱动程序,并且具有其文件系统的特定分区被抽象在单个虚拟文件系统(单个文件目录树,其中包含其他设备作为其子树) )。

所以,基本上不,您需要使用内核抽象接口(@98​​7654321@、/proc/mounts 等)来搜索文件或滚动您自己的用户空间驱动程序(例如通过 FUSE)来检查原始块设备(/dev/sda1 等) 如果你真的需要检查底层细节(这需要对内核/文件系统内部有很多了解,而且很容易出错)。

【讨论】:

    【解决方案3】:
    updatedb -l 0 -o db_file -U source_directory
    

    这将创建一个包含文件的数据库,希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      没有。文件系统实际上是由目录构成的,每个目录都包含文件和目录。

      在 Linux 中,所有这些都通过 inode 管理到内核中。

      【讨论】:

        【解决方案5】:

        是的。

        从概念上讲,它确实会为每个文件在光盘上的位置创建一个表**。有很多细节使这张照片略显混乱。

        但是,您通常不应该在意。你不想在那个水平上工作,你也不应该。 Linux 中有许多文件系统,它们都以略微(或什至显着)不同的方式进行操作。

        ** 实际上不是物理位置。硬盘驱动器可以通过其固件确定的某种方式将逻辑块映射到物理块。

        【讨论】:

          猜你喜欢
          • 2014-01-28
          • 1970-01-01
          • 1970-01-01
          • 2013-12-05
          • 1970-01-01
          • 1970-01-01
          • 2018-04-10
          • 2012-04-04
          • 1970-01-01
          相关资源
          最近更新 更多