【问题标题】:Compressed array of file paths and random access压缩的文件路径数组和随机访问
【发布时间】:2012-08-29 20:27:08
【问题描述】:

我正在开发一个文件管理 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): 我刚刚意识到我的问题可以重新表述:
如何为磁盘上的每个文件和每个文件夹分配唯一整数索引,以便我能够按索引快速找到文件/文件夹,已知文件/文件夹的索引,并在不更改许多索引的情况下执行基本文件操作?

编辑 (3): Here 是关于类似但与 Linux 相关的问题的问题。建议使用文件名和内容哈希来识别文件。是否有一些特定于 Windows 的改进?

【问题讨论】:

    标签: windows filesystems compression random-access


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 2021-09-25
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      相关资源
      最近更新 更多