gpt4 book ai didi

c# - 依赖于其他 Disposable 的 Disposable

转载 作者:太空宇宙 更新时间:2023-11-03 22:49:20 25 4
gpt4 key购买 nike

我有一个基于字符串列表处理文件流的应用程序,字符串可以是磁盘上的文件,也可以是 Zip 文件中的文件。为了清理代码,我想重构打开文件的过程。

我创建了一个返回文件内容 Stream 的方法,但是因为流依赖于 ZipFile IDisposable,所以当我读取流时,ZipFile 已被释放并抛出异常。

void Main()
{
using (var stream = OpenFileForImport("zipfile.zip;insidefile.txt"))
new StreamReader(stream).ReadToEnd(); // Exception

using (var stream = OpenFileForImport("outside.txt"))
new StreamReader(stream).ReadToEnd(); // Works
}
public static Stream OpenFileForImport(string filePath)
{
var path = Path.Combine(basefolder, filePath);

if (path.Contains(";"))
{
var parts = path.Split(';');
var zipPath = parts[0];

//Error checking logic to ensure zip file exists and is valid...
using (var zip = ZipFile.OpenRead(zipPath))
using (var entry = zip.GetEntry(parts[1]))
{
//Error checking logic to ensure inside file exists within zip file.
return entry.Open();
}

}

var file = new FileInfo(path);
if (file != null)
return file.OpenRead();

return null;

}

我可以从 zipentry 声明中删除 using 子句,但我怀疑它们是否会被处理掉。当依赖于其他一次性用品时,是否有适当的模式来退回一次性用品?

最佳答案

不要直接返回流,而是返回一个一次性对象,该对象可以提供您要处理的流,但在处理流时会清理该流和其他依赖资源:

public class NameToBeDetermined : IDisposable
{
private ZipFile zip;
public Stream Stream { get; }
public NameToBeDetermined(ZipFile zip, Stream stream)
{
this.zip = zip;
Stream = stream;
}
public void Dispose()
{
zip.Dispose();
Stream.Dispose();
}
}

然后返回that,而不是流本身。如果值得花时间,您可以将该包装器变成 Stream 本身,它只是将所有 Stream 方法转发到组合流中,但是在处理时会做额外的工作.是否值得花时间创建更复杂的包装器而不是让调用者访问 Stream 属性取决于您。

关于c# - 依赖于其他 Disposable 的 Disposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48214328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com