2011-05-18 62 views
1

我有一個程序(部署到每個用戶計算機的副本),以便用戶將文件存儲在具有壓縮(CAB文件)的集中式文件服務器上。如何鎖定多用戶文件管理系統中的文件

添加文件時,用戶需要將文件提取到自己的磁盤上,添加文件並將其壓縮回服務器。因此,如果兩個用戶同時處理相同的壓縮文件,則稍後上載的文件將會更早更新並導致數據丟失。

我的策略是防止這種情況出現在用戶提取壓縮文件之前,程序會檢查服務器上是否存在指定的臨時文件。如果沒有,程序會創建這樣的臨時文件以防止其他用戶的干擾,並且會在上傳後刪除臨時文件;如果是,程序將等待,直到臨時文件被刪除。

有沒有更好的方法來做到這一點?並且會經常創建和刪除空文件損壞磁盤?

回答

0

查看FileStream.Lock方法。從MSDN引用:

防止其他進程讀取或寫入FileStream。
...

鎖定文件流的範圍使鎖定進程的線程可獨佔訪問該文件流的範圍。

+0

我不知道如果我使用鏈接中的示例鎖定它,是否仍然可以提取壓縮文件。 – Bolu 2011-05-18 13:58:55

+0

@Bolu - 你有沒有試過。 – 2011-05-18 14:24:59

+0

@Ramhound,我不能在不釋放鎖的情況下更新壓縮文件。 – Bolu 2011-05-18 14:58:48

1

創建臨時文件來標記鎖是一種可行且廣泛使用的選項(並且不會損壞磁盤)。另一個選擇是專門打開壓縮文件(或讓其他進程只讀取文件但不寫入文件),並在用戶使用文件內容時保持打開文件。

2

而且會經常創建和刪除空文件損壞磁盤嗎 ?

不可以。如果您使用的是固態磁盤,則可以執行的寫入數量(這是FLASH的繼承限制)存在理論上的限制。但是,你難以置信地達不到這個限制。

有沒有更好的做這個

好方式,我會去了解這個不同:

寫Windows服務處理所有磁盤訪問,並讓您的客戶端應用交談的服務。因此,當客戶端需要檢索文件時,它會打開一個到您的服務的套接字連接並請求該文件,並將其保存在內存中或將其保存到本地磁盤。在客戶端的本地文件副本(解壓縮,添加/刪除/更新文件,重新壓縮等)上執行任何修改,並且當操作完成並準備好保存(或以源代碼控制術語提交)時,更改,打開另一個連接到服務應用程序(在服務器上運行)的套接字連接,並將新文件內容作爲二進制流發送給它。

然後服務應用程序將處理加載並將文件保存到磁盤。這也給了你很多額外的功能 - 服務器可以跟蹤以前的版本(甚至可能將每個版本提交給svn或其他源代碼管理系統),提供元數據,如最新版本等。

現在我正在考慮它,你可能會更好的只是將svn接口集成到你的應用程序中。 SharpSVN is a good library for this.

1

有沒有更好的方法來做到這一點?

是的。從你在這裏寫的內容來看,這聽起來像你正在重新發明revision control。 也許你可以使用一些現成的版本控制系統? 或者至少可以重複使用這些系統的一些代碼? 或者你至少可以瞭解一些有關這些系統面臨的問題,如何修復顯而易見的問題導致非顯而易見的問題,並試圖建立一個至少可以工作的系統?

我的理解是,版本控制系統經歷了幾個階段(請參閱原始wiki上的 "Edit Conflict Resolution",波特蘭模式存儲庫)。 大致按時間順序排列:

  1. 主版本存儲在服務器上。最後保存的勝利,導致神祕的數據丟失,沒有任何警告。
  2. 主版本存儲在服務器上。當我將副本拉到我的機器上時,系統會在服務器上創建一個鎖定文件。當我將更改推送到服務器(或取消)時,系統會刪除該鎖定文件。沒有人可以更改服務器上的這些文件,所以我們修復了「神祕的數據丟失」問題,但是當我需要編輯一些其他人在離開長假期之前簽出的文件時,我們感到無限的沮喪。
  3. 主版本存儲在服務器上。首先保存勝利(「樂觀鎖定」)。當我從服務器上獲取最新版本時,它包含某種版本號。當我稍後將我的編輯推送到服務器時,如果我拉出的版本號與服務器上的當前版本不匹配,則其他人先切入並改變了我的前提,並且系統給出了某種禮貌信息告訴我這件事。理想情況下,我從服務器上獲取最新版本,並仔細地將其與我的版本合併,然後將合併後的版本推送到服務器,並且一切都很美妙。唉,常常,一個不耐煩的人拉動最新版本,用「他的」版本覆蓋它,並推動「他的」版本,導致數據丟失。
  4. 每個版本都存儲在服務器上,並且鏈接不中斷。 (集中版本控制像TortoiseSVN就是這樣)。
  5. 每個版本都存儲在每個本地工作目錄中;有時鏈條分成兩條鏈;有時兩條鏈會合併成一條鏈。 (像TortoiseHg這樣的分佈式版本控制工具就是這樣的)。

因此,聽起來好像你正在做其他人從第一階段轉到第二階段時做的事情。我想你可以慢慢地在每個階段工作。 或者也許你可以跳到第4或第5階段並節省每個人的時間?

+0

謝謝。我不確定我是否在進行版本控制,它只是文件管理,因此每個人都可以在服務器上添加或查看文件(每個用戶之間應該沒有不同的版本)。 – Bolu 2013-07-26 14:04:19

+0

當你說「後來上傳的版本會替換之前的版本並導致數據丟失」時,聽起來至少有兩個版本(早期版本和後期版本),與(1)完全相同。 – 2013-07-27 01:16:08

相關問題