2012-08-29 54 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)。

關於你的第二次編輯,這似乎與哈希表的功能相匹配,但這是爲了索引而不是壓縮存儲。