我已经从blob存储中下载了一个zip文件并将其保存到windows phone的独立存储中,如下所示: - 从blob下载FileStream fs。
public static void SaveToIsolatedStorage(FileStream fs, string fileName)
{
var isolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
using (var streamWriter =
new StreamWriter(new IsolatedStorageFileStream(fileName,
FileMode.Create,
FileAccess.ReadWrite,
isolatedStorage)))
{
streamWriter.Write(fs);
}
}
但是当使用IsoStoreSpy检查此zip文件时,它显示已损坏。我通过从隔离存储中读取来检查它并尝试解压缩但不能正常工作。我确信它已损坏,因为当我使用IsoStoreSpy替换此文件时使用其他zip,然后尝试解压缩它然后它正在工作。
修改: -
从Blob下载的代码
private async Task DownloadFileFromBlobStorage()
{
var filename = "AppId_2.zip";
var blobContainer = GetBlobClient.GetContainerReference("testwpclientiapcontainer");
var blob = blobContainer.GetBlockBlobReference(filename);
using (var filestream = new FileStream(filename, FileMode.Create))
{
await blob.DownloadToStreamAsync(filestream);
SaveToIsolatedStorage(filestream, filename);
}
}
所以任何人都知道如何将zip文件保存到独立的存储空间而不会损坏它?
答案 0 :(得分:1)
您正在使用StreamWriter
。这是文本。您根本不应该使用它来复制zip文件。绝不要将任何TextWriter
用于二进制数据。
接下来,您使用的是StreamWriter.Write(object)
,它基本上会在ToString
上拨打FileStream
。那也不行。
您应该创建IsolatedStorageStream
,然后拨打fs.CopyTo(output)
。
public static void SaveToIsolatedStorage(Stream input, string fileName)
{
using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
{
// Simpler than calling the IsolatedStorageFileStream constructor...
using (var output = storage.CreateFile(fileName))
{
input.CopyTo(output);
}
}
}
在您的编辑中,您显示的代码首先保存到FileStream
,然后从当前位置复制流。正如您在评论中指出的那样,您需要先将其倒回。
我个人在这里根本不会使用FileStream
- 你为什么要将它保存为普通文件和一个孤立的文件?只需使用MemoryStream
:
using (var stream = new MemoryStream())
{
await blob.DownloadToStreamAsync(filestream);
stream.Position = 0;
SaveToIsolatedStorage(stream, filename);
}
(请注意,您的SaveToIsolatedStorage
方法仍然是同步的......您可能希望考虑异步版本。)