我正在研究涉及維護兩個本地目錄之間一致性的應用程序。具體來說,目錄應該是相同的,除了其中一個目錄中的所有文件都以某種特定的方式修改(這部分對我的問題並不重要)。允許兩個根路徑之間高效同步的敏感數據結構是什麼?
運行時,我的應用程序運行兩個進程,用於監聽每個路徑下發生的更改,並執行相關操作以在必要時使其恢復同步。
就我的具體問題而言:我正在尋找關於何時啓動應用程序的tricker情況的建議。此時,每個進程都需要檢查所有正在查看的路徑下的所有文件/文件夾,以查看應用程序未運行時是否有任何更改。 (讓我們假設應用程序不能在OS關閉時發生任何事情通知OS,因此將需要直接檢查每個文件/文件夾。)
每個進程將有權訪問(並維護)一個所有文件/文件夾在其指定路徑下的持久數據結構。我在考慮在每個文件和文件夾的數據結構中應該包含以下內容:
- 文件/文件夾名稱;
- 文件哈希(CRC32);
- 文件/文件夾最後的mod數據;和
- 文件/文件夾大小。
這些信息顯然有助於檢查文件/文件夾的任何更改,但是存儲它們的最佳方式是什麼?
在我看來,處理應用程序啓動情況的一種明智方式是每個進程遞歸掃描指定路徑下的所有文件/文件夾,並將掃描的每個文件的元數據與存儲在其數據結構。然後,這些進程還應該遍歷數據結構以查找已從路徑中刪除的內容。在這個過程中可能遇到的一些情況是:
- 修改文件(在數據結構中找到的文件名,但散列不同);
- 添加文件(在數據結構中沒有相同的文件名或哈希);
- 重命名文件(數據結構中存在具有相同散列的文件,但不具有相同的文件名);
- 文件夾已添加(數據結構中沒有文件夾名稱);
- 文件夾已刪除(數據結構中的文件夾名稱,但不在路徑下);
- 文件夾改名(棘手的一個)。
那麼,什麼是最好的數據結構用於這項任務?在我的腦海中,我正在考慮某種形式的排序關聯數組,例如紅黑樹,它存儲了file
和folder
對象。每個file
對象包含name
,hash
和mod-date
屬性,而每個folder
對象包含name
和children
屬性,其中children
存儲另一個關聯數組,其中包含所有內容。給定到任意文件的路徑,例如/foo/bar/file.txt
,您從根(foo
)開始,檢查bar
依此類推,直到您到達file.txt
的父對象。
我能想到的另一種方法是隻存儲一切斷然,使得在一個紅黑樹,其中每個關鍵是每個文件/文件夾的完整路徑,並將該值是file
/folder
對象。這對於檢索來說可能會更快,但是無論如何都無法遍歷所有值來檢測重命名的文件/文件夾,這聽起來很昂貴。在第一種方法中,識別重命名的情況可能只涉及檢查數據結構的一部分而不是全部。
對不起,上述想法並不是非常深思熟慮。這個領域的藝術狀況如何?對於這些類型的問題,是否有任何行之有效的方法?
對不起,我花了這麼長時間來回答這個問題。我使用了你的方法,使用紅黑樹和CRC字典,它的性能表現非常好。謝謝。 – Edwardr