我正在開發文件管理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的改進?