我正在創建一個Windows服務,它在插入特定USB密鑰時運行。 它所做的很簡單:聯繫FTP服務器,下載某些文件並將它們存儲在(加密的)存檔在USB上。可以使用提供給客戶端的工具以只讀 打開存檔(但這與我的問題無關)。基於事務的歸檔容器
該服務用於保持USB與主服務器同步(非常像Dropbox,但只有下載和同步文件夾位於可移動媒體上)。檔案可以增長到幾千兆字節。大約1GB的文件每週更新約400個用戶的密鑰。
由於整個更新過程對於用戶來說都是透明的,所以當數據被寫入存檔時(即使我提出某種尖叫,華而不實的警告:),他們不可能忽略USB。 請勿插入)。破壞歸檔文件需要全部下載,這意味着已經加載的服務器浪費了很多帶寬。
所以基本上我需要寫入檔案爲成交。如果他們失敗了,只要他們不將容器置於不一致的狀態即可。要麼是該文件完全寫入,要麼是而不是。如果文件是部分寫入的,如果容器沒有實際「看到」它也沒關係。
現在的問題是: 我該如何保證數據的一致性?具體來說,你如何使IO操作作爲事務處理?你會建議什麼?我應該自己實施一些事情嗎?或者是否有容器提供這種功能?
這是我到目前爲止有:
- 創建一個新的歸檔文件,重命名提交:不可能,檔案過大。
- 郵編/焦油/ 7Z:不合適,寫入失敗會破壞存檔
- TrueCrypt的:不合適的,因爲它需要一個文件系統驅動程序(即用戶點不具有管理員權限)。
- 任何需要將文件系統映射到文件的東西:不適合,非常確定,如果不是管理員就無法做到這一點,但如果可能的話,那將非常棒。
- 將文件存儲在SQLite數據庫中:這是ACID,因此確實可能是一個解決方案。但是,它需要分割文件,因爲SQLite的BLOB容量有限。不是很優雅,但我已經準備好了。另外SQLite的事務日誌在存儲大塊的時候會變得非常大。
- 自己實施:我寧願儘量避免這種情況,但我並不害怕這樣做。我只是覺得這個話題很複雜。
如果這個問題太籠統,請把它移到SU或其他東西。
是否將USB格式化爲NTFS? – Fanael
@Fanael是的,否則檔案無論如何不適合。 –
在這種情況下,如果你只對Vista和以上版本感興趣,也許你應該嘗試'CreateFileTransacted'及其朋友? – Fanael