Zip文件在我将其保存到隔离存储时损坏

时间:2014-07-02 20:31:17

标签: c# windows-phone-8 zip isolatedstorage

我已经从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文件保存到独立的存储空间而不会损坏它?

1 个答案:

答案 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方法仍然是同步的......您可能希望考虑异步版本。)