表示文件系统表
我正在做一个简单的类,类似于“内存中的类Linux文件系统”,主要是为了学习。文件会用StringIO对象来表示。我现在在考虑怎么在Python中实现文件和文件夹的层级结构。我在想是不是可以用一个对象列表,每个对象有类型、名称和父级等字段。也许我应该研究一下树和图的结构。
更新:
这个系统会有以下方法:
new_dir(path) - 创建新文件夹,
dir_list(path) - 列出文件夹里的内容,
is_file(path) - 判断路径是不是文件,
is_dir(path) - 判断路径是不是文件夹,
remove(path) - 删除文件或文件夹,
read(file_descr) - 读取文件内容,
file_descr open(file_path, mode=w|r) - 打开文件,模式可以是写入或读取,
close(file_descr) - 关闭文件,
write(file_descr, str) - 写入内容到文件。
4 个回答
文件存储的接口是什么样的?你想要保存文件的创建时间、修改时间和访问时间吗?可以想象,主要是通过文件名来查找文件。还有其他的查找操作吗?
如果只需要通过名字来查找文件,那么可以把文件存储的根目录映射成一个Python字典。每个条目的键就是文件名,值可以是一个StringIO对象(提示:在Python 2中,如果性能有问题,可以使用cStringIO来提高效率)或者另一个字典。StringIO对象代表你的文件,而字典则代表子目录。
所以,要访问任何路径,你需要把它拆分成各个部分(使用.split("/")
),然后用每个部分依次查找下一个元素。如果出现KeyError异常,那就意味着“文件或目录未找到”,尝试索引StringIO对象也会出现类似的错误(我懒得去确认具体的异常)。
如果你想实现更详细的功能,可以把StringIO对象和字典替换成某个“文件存储对象”类的实例。你可以把它叫做“链接”(因为它模拟的就是Linux的硬链接)。这个对象的各种属性可以很方便地操作,以保持文件属性的最新状态,而.data
属性可以像之前一样是StringIO对象或字典。
总体来说,我更倾向于第二种解决方案,因为这样可以很容易地实现一些方法,比如在操作执行时更新访问时间,但正如我所说,这取决于你想提供的细节程度。
你可以试试使用 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
用嵌套的列表来表示树结构是完全可行的。不过,因为通常情况下,列表里的条目是通过名字来索引的,而且目录一般被认为是无序的,所以用嵌套的字典会让很多操作变得更快,也更容易写。
不过,我不会为每个条目存储它的父级信息,因为这个信息可以通过它在层级中的位置来推断出来。
另外,如果你想让你的虚拟文件系统高效地支持硬链接,你需要把文件的内容和目录结构分开。这样,你就可以通过给每个内容赋予多个名字来重复使用这些内容,这就是硬链接的作用。