快速轻松地从一个文件加载所需的内容?

想象一下,有一个有很多内容的游戏,比如汽车模型。 我不想让他们一直在内存中,只想在需要的时候加载它们。 每辆车上只有一个文件就很容易了 – 但是最后我会有这么多文件,项目很难分享等等。

但是,当我把所有的东西存入一个文件,我不知道在哪里。 有没有办法将所有内容都存储到一个文件中,并像浏览内容条目时一样轻松导航到内容? 唯一可以想象的是保存第二个文件(或者作为内容文件中的头部)开始的字节位置,但是我很不确定这个解决scheme。

Solutions Collecting From Web of "快速轻松地从一个文件加载所需的内容?"

一个简单的方法就是当你编写你保持跟踪(在内存中)的东西的地方。 然后,在文件的末尾写一个索引。 所以你的文件看起来像这样:

offset 0: data for object 1 offset 0x0473: data for object 2 offset 0x1034: data for object 3 etc. 

你可以用BinaryWriter写这个文件。 在编写每个对象之前,先查询writer.BaseStream.Position以获取文件的当前位置。 您将该信息保存在内存中(只是对象名称和位置)。

当你完成了所有的对象,你保存当前的位置:

 indexPosition = writer.BaseStream.Position; 

然后在文件末尾写下索引:

 name: "object 1", position: 0 name: "object 2", position: 0x0473 etc. 

写一个空的索引条目来表示对象的结尾:

 name: "", position: 0xFFFFFFFF 

最后你要做的是在文件末尾写下索引位置:

 writer.Write(indexPosition); 

现在,您可以用BinaryReader打开文件。 寻找到文件结束减8字节,在那里读长整数。 这给了你指数的位置。 寻找索引,并开始阅读索引条目,直到你有一个位置为0xFFFFFFFF。

你现在有索引在内存中。 您可以创建一个Dictionary<string, long>以便给定一个对象名称,您可以在文件中找到它的位置。 获取位置,在那里寻找,并阅读对象。

90年代末我们写游戏的时候,这种事情是很常见的。 你仍然可以做到这一点,尽管你可能更喜欢简单的数据库。

如果要将文件临时存储在较大的文件中进行传输,则可以使用不同的压缩和存档方法来保存文件。 几乎所有的压缩方法都可以工作,你选择的完全取决于你。

示例.zip压缩可以在这里找到: http : //msdn.microsoft.com/en-us/library/ms404280.aspx

还有.cab文件格式,您可以在需要时将多个文件轻松打包并解压缩。 有一篇关于在C#中创建.cab文件的有趣文章:

http://mnarinsky.blogspot.com/2009/11/creating-cab-file-in-c.html

它确实需要添加对Microsoft.Deployment.Compression.Cab.dll和Microsoft.Deployment.Compression.dll的引用,但代码本身在此之后相当简单。 如果您发现这些都不是您的问题的合适答案,我唯一的其他建议是,您可以更好地组织这些文件,而不是将它们全部整理到一个文件夹中,因为这可能会导致很难导航。

也可以尝试使用集合来跟踪文件名,如果这也有帮助。 您可以在XML中定义文件,并将所有内容加载到字典或散列表中(如果需要更动态的话)或者在代码中定义它,如果您愿意的话。

编辑:

您也可以尝试使用第三方安装程序进行传输。 它们提供许多压缩和打包文件之外的功能,并将为您处理数据压缩。 我个人比较喜欢NSIS,因为我发现它对用户非常友好,但是任何安装程序都可以工作。 几个示例安装程序是:

Installshield: http : //www.installshield.com/ (与Visual Studio集成)

WIX: http ://wix.sourceforge.net/(也与Visual Studio集成,如果你正在寻找更多的基于XML的东西,

NSIS: http : //nsis.sourceforge.net/Main_Page (可脚本化,不与Visual Studio集成,如果不想自己完成大部分脚本,则使用Nsisqssg轻松指导设计)

他们都运作不同,但本质上达到相同的最终结果。 这一切都取决于你在找什么。