我正在开发一个文件管理 Windows 应用程序。该程序应保留磁盘上所有文件和文件夹的路径数组。例如:
0 "C:"
1 "C:\abc"
2 "C:\abc\def"
3 "C:\ghi"
4 "C:\ghi\readme.txt"
“原样”的数组将非常大,因此应将其压缩并存储在磁盘上。但是,我想随机访问它:
- 通过索引检索数组中的任何路径(例如,
RetrievePath(2) = "C:\abc\def"
) - 查找数组中任何路径的索引(例如,
IndexOf("C:\ghi") = 3
) - 向数组添加新路径(任何现有路径的索引不应更改),例如,
AddPath("C:\ghi\xyz\file.dat")
- 重命名数据库中的某些文件或文件夹;
- 删除现有路径(同样,任何其他索引都不应更改)。
例如,1 "C:\abc"
从数据库中删除路径,仍然有4 "C:\ghi\readme.txt"
.
有人可以提出一些好的算法/数据结构/想法来做这些事情吗?
编辑:
目前我想出了以下解决方案:
0 "C:"
1 "[0]\abc"
2 "[1]\def"
3 "[0]\ghi"
4 "[3]\readme.txt"
也就是说,公共前缀被压缩。
RetrievePath(2) = "[1]\def" = RetrievePath(1) + "\def" = "[0]\abc\def" = RetrievePath(0) + "\abc\def" = "C:\abc\def"
IndexOf()
也可以迭代地工作,就像这样:IndexOf("C:") = 0 IndexOf("C:\abc") = IndexOf("[0]\abc") = 1 IndexOf("C:\abc\def") = IndexOf("[1]\def") = 2
要添加新路径,比如说
AddPath("C:\ghi\xyz\file.dat")
,应该首先添加它的前缀:5 [3]\xyz 6 [5]\file.dat
重命名/移动文件/文件夹只涉及一个替换(例如,替换
[0]\ghi
将[1]\klm
重命名目录"ghi"
到"klm"
并将其移动到目录"C:\abc"
)DeletePath() 涉及将其(和所有子路径)设置为空字符串。将来,它们可以被新的路径所取代。
之后DeletePath("C:\abc")
,数组将是:0 "C:" 1 "" 2 "" 3 "[0]\ghi" 4 "[3]\readme.txt"
整个数组仍然需要加载到 RAM 中以执行快速操作。例如,总共有 1000000 个文件和文件夹,平均文件名长度为 10,该数组将占用超过 10 MB。
此外,函数IndexOf()
被迫按顺序扫描数组。
编辑(2):我刚刚意识到我的问题可以重新表述:
如何为磁盘上的每个文件和每个文件夹分配唯一整数索引,以便我能够通过索引快速找到文件/文件夹,已知文件的索引/folder,并在不更改许多索引的情况下执行基本文件操作?
编辑(3): 这是一个关于类似但与 Linux 相关的问题的问题。建议使用文件名和内容哈希来识别文件。是否有一些特定于 Windows 的改进?