2012-08-29 29 views
2

我正在开发文件管理Windows应用程序。该程序应该为磁盘上的所有文件和文件夹保留一组路径。例如:压缩数组文件路径和随机访问

0 "C:" 
1 "C:\abc" 
2 "C:\abc\def" 
3 "C:\ghi" 
4 "C:\ghi\readme.txt" 

数组“原样”将会非常大,所以它应该被压缩并存储在磁盘上。然而,我想必须把它随机访问:

  1. 通过索引检索阵列中的任何路径(例如,RetrievePath(2) = "C:\abc\def"
  2. 找到阵列中的任何路径的指数(例如,IndexOf("C:\ghi") = 3
  3. 向数组添加新路径(任何现有路径的索引不应改变),例如,AddPath("C:\ghi\xyz\file.dat")
  4. 重命名数据库中的某个文件或文件夹;
  5. 删除现有路径(再次,任何其他索引不应该改变)。
    例如,从数据库中删除路径1 "C:\abc",仍然有4 "C:\ghi\readme.txt"

有人可以建议一些好的算法/数据结构/想法来做这些事情吗?

编辑:
目前我已经想出了以下解决方案:

0 "C:" 
1 "[0]\abc" 
2 "[1]\def" 
3 "[0]\ghi" 
4 "[3]\readme.txt" 

也就是说,常见的前缀被压缩。

  1. RetrievePath(2) = "[1]\def" = RetrievePath(1) + "\def" = "[0]\abc\def" = RetrievePath(0) + "\abc\def" = "C:\abc\def"
  2. IndexOf()也适用反复,这样的事情:

    IndexOf("C:") = 0 
    IndexOf("C:\abc") = IndexOf("[0]\abc") = 1 
    IndexOf("C:\abc\def") = IndexOf("[1]\def") = 2 
    
  3. 要添加新的路径,说AddPath("C:\ghi\xyz\file.dat"),应先加了前缀:

    5 [3]\xyz 
    6 [5]\file.dat 
    
  4. 重命名/移动文件/文件夹只涉及一个替换(例如,与取代[1]\klm[0]\ghi目录"ghi"重命名为"klm",并将其移动到目录"C:\abc"

  5. 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的改进?

回答

1

您的解决方案看起来不错。你也可以尝试使用ad-hoc技巧来压缩更多,例如只用于常用字符(如“\”,驱动器号,常用文件扩展名等等)。你也可以看看尝试(http://en.wikipedia.org/wiki/Trie)。

关于你的第二次编辑,这似乎与哈希表的功能相匹配,但这是为了索引而不是压缩存储。