[英]Editing large binary files
我正忙着一個小項目,它有很多數據,比如圖像文本文件和其他東西,我試圖把它全部打包在一個大文件或多個大文件中,所以程序文件夾看起來並不亂。
但問題是如何編輯這些文件。 我已經考慮過文件結構,它會是這樣的:
[DWORD] Number of files [DWORD]FileId [STRING]FileName [DWORD]FileSize [DWORD]FileIndex [BYTES]All the files
因此,第一部分太快得到所有文件的列表,而FileIndex是二進制文件中的位置,所以我也可以設置指針,例如300並讀取文件。
但是,如果我想創建一個補丁並編輯它,我將不得不在我編輯的文件之后讀取所有字節並將它們全部復制回來,這可能需要幾年的文件。
插入所有文件后,二進制文件可能只有幾百MB。
那么其他程序如何做到這一點,例如游戲使用這些大文件,還有很多補丁是否有某種技巧可以更快地插入額外的字節?
在文件中間插入字節沒有“技巧”。
通常解決方案涉及將文件添加到文件末尾,然后在索引中切換它們的位置。 然后你遇到了必須對文件進行碎片整理的問題。 您可以將文件分成大塊,這可以減輕一些碎片整理問題,但文件不是連續的。
如果您正在處理非靜態數據,除非您絕對必須,否則我不建議您這樣做。 我見過絕對優秀的軟件工程師花了相當多的時間來寫一個合理的實現。
使用sqlite作為虛擬文件系統可以是一個可行的解決方案。 但話說回來,將數據文件放在另一個文件夾中也是如此,因此它看起來並不“混亂”。
如果可能的話,我可能會將數據打包成一個zip文件。 這不僅會清理你的目錄,而且(特別是你提到的文本文件)基本上免費提供一些壓縮。 當然,還有很多用於創建,檢查,修改zip文件的現有工具和庫。
使用zlib (例如),大部分工作都是為您處理的(例如,如minizip中所示 )。
您可以將打包和編輯程序視為自定義內存分配器:
或者,使用類似FAT的東西,而不是簡單的目錄。 對於每個文件,存儲塊和大小的列表。 當您將文件擴展到其當前分配之外時,添加另一個具有余數的塊。 根據需要偶爾進行碎片整理。
這兩個都會給包增加一點開銷,但是留下空白實際上是在每個插件上重寫整個東西的唯一選擇。
訣竅是通過覆蓋數據來制作補丁。 否則,有可用於管理大量數據的系統,例如數據庫。
您可以創建一個伴隨程序的數據庫文件,並將所有數據保存在那里,而不是文件中。 您甚至可以使用SQLite將數據庫代碼嵌入到應用程序中,或者使用外部數據庫,如Sql Server,Oracle SQL或MySql。
您所描述的基本上是實現您自己的文件系統。 要使其有效,這是一項棘手且非常困難的任務。
不能將字節插入到您描述的文件之外的文件中。 這與編程語言無關。 這就是文件系統的工作方式......
您可以覆蓋文件的某些部分,但只要您尊重字節數即可。
你有沒有想過使用.zip文件? 我一直在看那些存儲多個文件的格式,而底層文件實際上是一個zip文件。 關於這一點的好處是zip庫為您處理低級位跟蹤的東西。
想到幾個例子:
您可以使用受內存映射文件支持的托管共享內存 。 您仍需要為整個文件提供足夠的地址空間,但不需要將整個文件復制到內存中。 您可以將大多數標准工具與共享內存分配器一起使用,但您可以快速發現在任何地方指定自定義分配器都是件苦差事。 但好消息是你不需要自己實現它,你可以使用Boost.Interprocess ,它已經具備了unix和windows的所有必要功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.