在知道文件大小之前,如何增加Azure文件存储CloudFile的大小?

时间:2016-10-06 15:48:18

标签: stream zip cloud azure-storage azure-storage-files

我使用Azure文件存储来存储一些文件,我想在同一个Azure文件共享中创建一个包含其中一些文件的zip文件。

到目前为止,这是我的代码:

private void CreateZip(CloudFileDirectory directory) {

    if (directory == null) throw new ArgumentNullException(nameof(directory));

    var zipFilename = $"{directory.Name}.zip";

    var zip = directory.GetFileReference(zipFilename);
    if (!zip.Exists()) { 

        zip.Create(0);  // <-- I don't know what size its gonna be!!

        using (var zipStream = zip.OpenWrite(null))
        using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create)) {

            foreach (var file in directory.ListFilesAndDirectories().OfType<CloudFile>()) {
                if (file.Name.Equals(zipFilename, StringComparison.InvariantCultureIgnoreCase))
                    continue;                        

                using (var fileStream = file.OpenRead()) {

                    var entry = archive.CreateEntry(file.Name);
                    using (var entryStream = entry.Open())
                        fileStream.CopyTo(entryStream); // <-- exception is thrown
                }
            }
        }
    }
}

zip.Create(0);行上,这会创建一个空文件。然后我继续使用此文件引用来创建一个zip文件,并向其中添加内容,但是当它到达fileStream.CopyTo(entryStream);时,它会抛出一条带有此消息的异常:

The remote server returned an error: (416) The range specified is invalid for the current size of the resource.

大概是因为文件大小为0而且无法自动增加大小。

我可以用int.MaxValue创建文件,但后来我得到一个2GB的文件。我甚至无法计算文件的大小,我将添加到文件并调整文件大小以将其扩展到该数量,因为它是一个zip并且它将压缩并更改文件大小。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

此问题与System.IO.Compression更相关。我已经重写了你的代码,请使用内存流,而不是像下面的代码。它在我身边很好用。希望它可以给你一些提示。

       public static void CreateZip(CloudFileDirectory directory)
        {

            if (directory == null) throw new ArgumentNullException(nameof(directory));

            var zipFilename = $"{directory.Name}.zip";          
            var zip = directory.GetFileReference(zipFilename);
            if (!zip.Exists())
            {

                //zip.Create(600000);  // <-- I don't know what size its gonna be!!

                using (var memoryStream = new MemoryStream())
                {
                    using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
                    {

                        foreach (var file in directory.ListFilesAndDirectories().OfType<CloudFile>())
                        {
                            if (file.Name.Equals(zipFilename, StringComparison.InvariantCultureIgnoreCase))
                                continue;

                            using (var fileStream = file.OpenRead())
                            {

                                var entry = archive.CreateEntry(file.Name, CompressionLevel.Optimal);
                                using (var entryStream = entry.Open())
                                {

                                    fileStream.CopyTo(entryStream); // <-- exception is thrown
                                }

                            }
                        }
                    }
                    memoryStream.Seek(0, SeekOrigin.Begin);
                    zip.UploadFromStream(memoryStream);

                }

            }
        }