【问题标题】:Representing filesystem table表示文件系统表
【发布时间】:2011-12-14 08:59:17
【问题描述】:

出于教育目的,我正在编写类似“in memory linux-like filesystem”之类的简单类。文件将作为 StringIO 对象。我无法决定如何在 Python 中实现文件文件夹层次结构类型。我正在考虑使用带有字段的对象列表:类型、名称、父级还有什么?也许我应该寻找树木和图表。

更新:

会有这些方法:

new_dir(路径), 目录列表(路径), is_file(路径), is_dir(路径),删除(路径), 读取(file_descr), 文件描述打开(文件路径,模式=w|r), 关闭(file_descr), 写(file_descr,str)

【问题讨论】:

  • 这个问题对于stackoverflow来说有点太宽泛了,而且非常开放。尝试提出一个非常具体的问题,以便清楚地知道要回答什么。
  • 我认为这个问题还可以,但是是开放式的。

标签: python filesystems


【解决方案1】:

完全可以将一棵树表示为一组嵌套的列表。但是,由于条目通常按名称进行索引,并且目录通常被认为是无序的,因此嵌套字典会使许多操作更快、更容易编写。

不过,我不会为每个条目存储父级,这是从其在层次结构中的位置隐含的。

此外,如果您希望您的虚拟文件系统有效地支持hard links,您需要将文件的内容从目录层次结构中分离出来。这样一来,您就可以通过为每个内容赋予任意数量的名称来重用内容,这就是硬链接的作用。

【讨论】:

    【解决方案2】:

    也许你可以尝试使用networkx。您只需要直观地调整它以与文件和文件夹一起使用。

    一个简单的例子

    import os,networkx as nx
    G=nx.Graph()
    for (path, dirs, files) in os.walk(os.getcwd()):
        bname = os.path.split(path)
        for f in files:
            G.add_edge(bname,f)
    # Now do what ever you want with the Graph
    

    【讨论】:

      【解决方案3】:

      你应该先问一个问题:我的“文件系统”应该支持哪些操作?

      根据您选择数据表示的答案。

      例如,如果您选择仅支持createdelete,并且字典中文件的顺序并不重要,则选择python 字典。字典会将文件名(子路径名)映射到字典或文件容器对象。

      【讨论】:

        【解决方案4】:

        文件存储的 API 是什么?您想保留创建、修改和访问时间吗?据推测,主要查找将按文件名进行。是否还有其他检索操作?

        如果只需要按名称查找,那么一种可能的表示是将文件存储根目录映射到 Python 字典。每个条目的键将是文件名,值将是 StringIO 对象(提示:在 Python 2 中,如果出现问题,使用 cStringIO 以获得更好的性能)或另一个 dict。 StringIO 对象代表你的文件,字典代表子目录。

        因此,要访问任何路径,您需要将其拆分为其组成部分(使用.split("/")),然后使用每个路径查找一个连续的元素。任何 KeyError 异常都意味着“找不到文件或目录”,任何尝试索引 StringIO 对象的尝试也是如此(我懒得验证具体异常)。

        如果你想实现更多细节,那么你可以用一些“文件存储对象”类的实例替换 StringIO 对象和字典。您可以将其称为“链接”(因为这就是它的模型:Linux 硬链接)。这个对象的各种属性可以很容易地被操纵来保持文件属性是最新的,.data 属性可以是一个 StringIO 对象,也可以是一个字典。

        总体而言,我更喜欢第二种解决方案,因为从那时起,通过在执行操作时更新访问时间等方法很容易实现保持访问时间最新的方法,但正如我所说,很大程度上取决于您想要的详细程度提供。

        【讨论】:

          猜你喜欢
          • 2012-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多