2

我正在使用 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,它会压缩和更改文件大小。

我该怎么做呢?

4

1 回答 1

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);

                }

            }
        }
于 2016-10-07T09:12:57.547 回答