我使用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并且它将压缩并更改文件大小。
我该怎么做?
答案 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);
}
}
}