我正在开发文件管理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
重命名/移动文件/文件夹只涉及一个替换(例如,与取代
[1]\klm
将[0]\ghi
目录"ghi"
重命名为"klm"
,并将其移动到目录"C:\abc"
)DeletePath()涉及设置它(和所有子路径)为空字符串。将来,他们可以被新的路径所取代。
DeletePath("C:\abc")
后,阵列将是:0 "C:" 1 "" 2 "" 3 "[0]\ghi" 4 "[3]\readme.txt"
整个阵列还需要在RAM中被加载到执行快速操作。例如,总共1000000个文件和文件夹和平均文件名长度为10,该阵列将占用超过10MB。
此外,函数IndexOf()
被强制按顺序扫描数组。
编辑(2):我才意识到,我的问题可以再次阐述:
我怎么可以指定每个文件和文件夹的磁盘唯一的整数索引,这样我就可以快速找到文件/文件夹通过索引,已知文件/文件夹的索引,并执行基本文件操作而不更改许多索引?
编辑(3):Here是关于类似,但与Linux相关的问题的问题。建议使用文件名和内容散列来标识文件。是否有一些特定于Windows的改进?