我想在我的wp8应用中放置大约45000个mp3文件, 所有这些都是声音效果,不到5k字节, 但是总空间超过150m字节。
我认为有两种方法可以存储它们。
使用二进制文件将所有文件保存在一个文件中,可能类似于以下结构:
first 4bytes : --length of mp3 file name;
first byte[]: --store the mp3 file name;
senc 4bytes: --length of mp3 file;
senc byte[]: --store the real content of mp3;
并重复此操作,将所有这些内容附加到一个文件中。
它只需要150米,但我必须寻找每个mp3文件的位置。
您认为哪一个更好?我更喜欢第二种解决方案。但是我没有发现任何api可以从偏移0寻找到偏移150 * 1024 * 1024,这可能会引发性能问题。
答案 0 :(得分:1)
我将第二个选项与索引和BinaryReader一起使用。您可以在文件中寻找position
(reference)(如下所示):
byte[] mp3File;
// Get the file.
var file = await dataFolder.OpenStreamForReadAsync("combined_mp3s.bin");
using (var binReader = new BinaryReader(file))
{
binReader.Postion = offset; // using your math ...
var fileName = binReader.ReadString(); (length prefixed string read)
// or you could read the size on your own and read the characters
var mp3FileLen = binReader.ReadInt32();
mp3File = binReader.ReaderBytes(mp3FileLen);
}
我建议您使用单独存储的每个文件的文件名和数据起始位置的哈希/字典,以便您的应用程序可以快速找到文件的内容而无需进行扫描。
您可能还需要考虑将大文件分解为一些较小的文件,以获得更好的下载体验。您可以附加到大文件,因为手机上可以使用组或单个文件的内容。
答案 1 :(得分:0)
您的第二种选择的问题是,通过避免使用文件系统,您将失去文件系统为您提供的大量便利。
也许最重要的是,您现在(使用您建议的数据结构)不再检索具有特定名称的文件,而无需扫描(可能)整个文件。
文件系统中的额外空间可能已被充分利用。