【发布时间】:2026-01-18 05:35:01
【问题描述】:
我能否在不将整个压缩内容写入临时存储的情况下为磁盘上的文件获取GZipStream?我目前正在磁盘上使用一个临时文件,以避免在非常大的文件上使用MemoryStream 可能导致内存耗尽(这工作正常)。
public void UploadFile(string filename)
{
using (var temporaryFileStream = File.Open("tempfile.tmp", FileMode.CreateNew, FileAccess.ReadWrite))
{
using (var fileStream = File.OpenRead(filename))
using (var compressedStream = new GZipStream(temporaryFileStream, CompressionMode.Compress, true))
{
fileStream.CopyTo(compressedStream);
}
temporaryFileStream.Position = 0;
Uploader.Upload(temporaryFileStream);
}
}
我想做的是通过创建GZipStream 来消除临时存储空间,并且仅在 Uploader 类向其请求字节时才从原始文件中读取它。这样的事情可能吗?如何构建这样的实现?
注意Upload 是一个带有签名static void Upload(Stream stream) 的静态方法。
编辑:如果有用的话,完整的代码是here。不过,我希望我在上面的示例中包含了所有相关的上下文。
【问题讨论】:
-
如何上传?你使用 NetworkStream 吗?还是您使用 HttpWebClient?还是别的什么?
-
@elgonzo 我使用 AWS 开发工具包 TransferUtilityUploadRequest。如果有用的话,完整的代码是here,尽管我希望它不是。我无法控制使用
Stream的代码,我只需为其提供Stream对象。 -
您需要将 GZipStream 构造函数中的temporaryFileStream 替换为要上传到的流。
-
@elgonzo 不太好用,因为
GZipStream在写入之前不包含字节。我想在完成写入之前从压缩流中开始读取,并且我不想在执行此操作时将压缩流的全部内容保存在磁盘或内存中。 -
@Boinst,对不起,我错了。没有注意到 GZipStream 不能作为过滤流来读取未压缩的文件并吐出压缩数据... Doh...
标签: c# gzipstream