簡體   English   中英

一種編輯大型二進制文件的事務模型

[英]A Transactional Model for Editing Large Binary Files

我正在為一些非常大的二進制文件創建二進制編輯器。 其中一個軟件要求是編輯器無法修改原始文件,因此目標文件必須是原始文件的編輯副本。

我想以這樣一種方式設計編輯器,即只復制文件一次(這將是一個20分鍾的過程)。 我知道我可以在編輯文件時鎖定文件,但是如果用戶退出程序,他們將不得不再次完成整個20分鍾的復制過程,除非我能找到一種方法來確定它們仍在他們原來的編輯會議。

是否有一些您可以想到的簡單過程我可以允許用戶以某種方式將復制的文件“注冊”為可編輯文件,當它們完成所有更改后,“完成”文件?

理想情況下,這樣的過程將允許我檢測可編輯文件或交易信息是否已經被中間編輯會話篡改(如果再次編輯文件,則篡改或最終化將導致發生另一個副本)。

  1. 在集中位置創建和維護會話記錄(db?)。
  2. 會話包括用戶名,如果您已經擁有它,或者IP,或者您想要用來唯一標識用戶的任何內容,以及字節的哈希值。 如果散列對於文件大小來說太麻煩,您可以嘗試依賴文件日期和大小。
  3. 當用戶關閉其編輯器時,您使用上述信息更新會話記錄並將其標記為非活動狀態。
  4. 當用戶重新打開編輯器時,您應該可以訪問您的密鑰信息,即用戶名和文件信息。 如果您找到會話記錄,那么您可以重新激活非活動會話,否則,它會被篡改或者是全新的。

這符合您的需求嗎?

我想你會想要記錄用戶采取的行動。 為了避免寫入源數據的副本,我會將日志保存在單獨的文件中。 使用時間戳信息存儲用戶的編輯內容。

當提交事務時,只需讀取日志文件中的更改列表並應用它們,按時間戳排序。

當用戶在編輯過程中需要從文件中讀取數據時,您必須將源文件的相關部分讀出到內存中,並將更改應用於日志文件中的數據。

這可能是最難的部分,具體取決於二進制文件格式。 如果您能夠以某種方式索引二進制文件的內容,我將在編輯日志中使用該信息。 這樣,您只能從日志文件中提取所需的數據,並且您將能夠確定哪些編輯適用於該數據。

如果你擁有的只是一個龐大的無形blob,那么你必須將整個內容保存在內存中,並在每次執行讀取時應用所有更改。 我認為,這里有優化的空間,但整個事情仍然非常令人發指。 如果不能限制讀取范圍,則必須假設任何編輯都可以隨時更改任何數據。

至於確保編輯,這是一個棘手的問題。 如果您在您信任的環境中運行,您可以保守秘密並使用它來驗證信息。 這很麻煩,但您可以散列二進制文件,編輯日志和僅為應用程序知道的秘密的串聯。 (沒有秘密,任何人都可以來,修改文件,並插入新的哈希。)

如果您在用戶本地的計算機(即桌面)上運行,保密可能非常困難,尤其是對於托管代碼。 這本身就是一個話題,我沒有給你一個好的答案。

難道你不能只在該文件中有一個字段,從開始或結束的固定偏移量,你在哪里放置會話信息,只是一個'正在編輯'的標志? 它可能包括對其當前編輯過程的引用(例如其pid)。 如果pid是我們的pid,那么這就是我們的會話。 如果它不是我們的pid,請查看進程列表。 如果存在具有此pid的進程,則它是合法編輯器; 如果沒有,我們會看到崩潰的結果,啟動崩潰恢復(如果有的話)。 如果pid為0,則文件已完全確定。

另外:如果大文件可供閱讀,你真的需要在編輯前復制嗎?

如果編輯與文件大小相比相當小,我會將用戶操作記錄為原始文件和結果之間的“差異”。 如果一次又一次地編輯相同的點,那么以某種方式“連接”差異可能是有用的,這樣就不會應用太多的差異層。 當然,用戶對文件的視圖是動態應用的所有差異。

在此期間,您復制文件,並且,一旦編輯會話結束並且文件完全在此處,您將所有差異應用於文件。 但是,根據允許的編輯的性質,這可能是也可能不是一個耗時的過程。 如果編輯會話超過20分鍾,則用戶可能根本沒有注意到等待時間。 您將鎖定文件的diff應用時間,這可能比復制時間短。

由於您正在考慮事務和文件系統活動,因此考慮事務性NTFS可能會有所幫助。 這不能回答您的問題,但可能會讓您對可能性有新的認識。 由於您的問題已標記為C#和Windows,因此您可能需要查看.NET包裝器,例如: http//offroadcoder.com/CategoryView,category,Transactions.aspx Scott Klueppel展示了如何利用TransactionScope熟悉的.NET習慣用法來處理事務性NTFS。 我對斯科特所做的事情做了快速測試,就像我所看到的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM