我已将小文件合并为大文件。在应用程序第一次启动时,会读取此文件,并在文件系统(隔离存储)上一个一个地创建小文件。
当此文件包含 44 个小文件并且约为 200kb 时 - 算法在设备上工作 120 毫秒。当此文件包含 140 个甚至更小的文件并且约为 400kb 时 - 算法在设备上工作 3000 毫秒。
如果我从这两个文件中只取 44 个文件 - 第一个文件仍然可以使用 ~120,第二个可以使用 ~800ms。
这对我来说似乎很奇怪。文件中数据的格式很简单
-INT32 - ENTRIES COUNT
--STRING ENTRY NAME |
--INT32 ENTRY DATA LENGTH | REPEATS {ENTRY COUNT} TIMES
--BYTE[] ENTRY DATA |
对我来说,这似乎是 Windows Phone 隔离存储机制中的一个魔法。在复制相同数量的条目时,完全没有理由让第二个文件慢 7-8 倍。
复制项目 - https://www.dropbox.com/s/6bjsve7p8wew3kb/IsoStorageWonder.zip?m
代码:
public static void CopyCache(ILogger logger)
{
using (var isoStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
var streamInfo = Application.GetResourceStream(new Uri(_dataFilePath, UriKind.RelativeOrAbsolute));
isoStorage.CreateDirectory("HttpCache");
var binaryReader = new BinaryReader(streamInfo.Stream);
{
int itemsCount = binaryReader.ReadInt32();
for (int i = 0; i < ENTRIES_COUNT; i++)
{
string fileName = binaryReader.ReadString();
int length = binaryReader.ReadInt32();
byte[] data = binaryReader.ReadBytes(length);
using (
var fileStream =
new IsolatedStorageFileStream(
Path.Combine(_rootCacheDir, fileName),
FileMode.Create,
FileAccess.Write,
FileShare.None,
isoStorage))
{
fileStream.Write(data, 0, data.Length);
}
}
}
}
}
魔法!