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. 重命名/移动文件/文件夹只涉及一个替换(例如,替换[0]\ghi[1]\klm重命名目录"ghi""klm"并将其移动到目录"C:\abc"

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

4

1 回答 1

0

您的解决方案似乎不错。您还可以尝试使用特殊技巧进行更多压缩,例如仅对常见字符(例如“\”)、驱动器号、可能是常见的文件扩展名等使用一些位。您还可以查看尝试 ( http://en.wikipedia.org/wiki/Trie )。

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

于 2012-08-30T13:04:45.063 回答