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

How do I increase the size of an Azure File Storage CloudFile before I know the file size?

我正在使用 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 的文件。我什至无法计算出要添加到 achive 中的文件的大小并调整文件的大小以将其扩展到该数量,因为它是一个 zip 并且会压缩和更改文件大小。

我该怎么做?

此问题与 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);

                }

            }
        }