【发布时间】:2012-08-29 20:27:08
【问题描述】:
我正在开发一个文件管理 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): 我刚刚意识到我的问题可以重新表述:
如何为磁盘上的每个文件和每个文件夹分配唯一整数索引,以便我能够按索引快速找到文件/文件夹,已知文件/文件夹的索引,并在不更改许多索引的情况下执行基本文件操作?
编辑 (3): Here 是关于类似但与 Linux 相关的问题的问题。建议使用文件名和内容哈希来识别文件。是否有一些特定于 Windows 的改进?
【问题讨论】:
标签: windows filesystems compression random-access