2012-03-20 26 views
1

假設我有一個文件夾包含幾個文件,圖像,文本,無論如何,它只是有很多文件和文件夾是相當大(> 100 MB)。現在我想更新這個文件夾中的五個文件,但我想以原子方式執行此操作,通常我只是創建一個臨時文件夾並將所有內容寫入其中,如果成功,則只需替換現有文件夾即可。但是因爲I/O比較昂貴,所以我不想這麼做(保留數百個文件來更新五個文件似乎是一個巨大的開銷)。但是,我該如何以原子方式編寫這五個文件呢?請注意,我希望將所有文件寫入原子,而不是每個文件分開。原子地寫入多個文件

回答

3

你可以調整你的原始解決方案:

  1. 創建一個臨時文件夾完整的硬鏈接的原始文件。
  2. 將五個新文件保存到臨時文件夾中。
  3. 刪除原始文件夾並將硬鏈接的文件夾移動到原來的位置。

創建幾個鏈接應該很快,並且避免重寫所有文件。

+0

被警告:雖然這樣可以避免出現一些新文件存在而其他文件不存在的情況,但這確實意味着有一段時間外部觀察者會看到該文件夾​​完全丟失。您不能自動刪除舊文件夾並將新文件夾移動到位。 (順便說一句,步驟3應該是:3a。重新命名原始文件夾,3b。重新命名新文件夾到位,3c。刪除重命名的原始文件夾。推遲刪除原始文件夾將最小化外部時間觀察員可以看到奇怪的東西。) – 2013-06-02 02:07:28

+0

我想到了這種方法的另一個問題。如果某個其他進程在步驟1之後和步驟3a之前在目標中創建文件,該怎麼辦?例如,考慮兩個程序同時採用相同的技術。如果你不小心,你會丟失文件。更安全的方法可能是:在臨時位置創建文件,將目標文件夾重命名爲ersatz聲明獨佔訪問權限的方法,將文件移入,然後重新命名。然而,你試圖做的事情本質上是非原子的,你無法真正解決它。你只需要選擇你的毒藥。 – 2013-06-03 01:24:10