我正在制作一个用户构建目录的程序(不是在 Windows 中,在我的应用程序中),并且在这些文件夹中有子文件夹等等;每个文件夹都必须包含文件夹或文档。什么是最好的数据结构?请注意,用户可以选择一个子文件夹并在其中及其子文件夹中搜索文档。而且我不想限制文件夹或子文件夹级别。
7 回答
这就是我所做的:
数据库中的每条记录都有两个字段:ID 和 ParentID。ID 为 4-5 个字符(Base36、az:0-9 或类似字符)。父 ID 是父级完整结构的串联...
所以...
这种结构:
Root
Folder1
Folder2
Folder3
Folder4
Folder5
Folder6
将像这样表示:
ID ParentID Name
0000 NULL ROOT
0001 0000 Folder1
0002 0000 Folder2
0003 00000002 Folder3
0004 0000 Folder4
0005 00000004 Folder5
0006 000000040005 Folder6
我喜欢这种结构,因为如果我需要查找文件夹下的所有文件,我可以执行如下查询:
SELECT * FROM Folders WHERE ParentID LIKE '0000%' -- to find all folders under Folder1
要删除文件夹及其所有子文件夹:
DELETE FROM Folders WHERE ID='0004' AND ParentID LIKE '00000004%'
要移动文件夹及其子文件夹,您必须将使用同一父文件夹的所有记录更新为新的父文件夹。
而且我不想限制文件夹或子文件夹级别
一个明显的限制是子文件夹的数量受限于 ParentID 字段的大小。
我可以想出几种方法来构建它,但没有什么能比得上显而易见的:
使用实际的文件系统。
我会考虑使用某种树数据结构
我应该推荐 B+ Tree .... 您可以轻松使用索引(页面、文件夹等)和所有 .
B+ 树 http://commons.wikimedia.org/wiki/File:Btree.png
欲了解更多信息: http: //ozark.hendrix.edu/~burch/cs/340/reading/btree/index.html
我知道这个问题是专门要求一个数据结构,但是......
如果您使用的是面向对象的语言,也许您可以使用非常适合这种类型的分层树状结构的复合设计模式。你得到你想要的。
大多数 OO 语言都带有文件系统的某种抽象,所以我将从这里开始。如果需要,然后将其子类化。
例如,我希望目录作为目录或文件的对象数组。
您可以使用 m-way 树数据结构