gpt4 book ai didi

c# - 临时解压缩 - 这是对 IDisposable 接口(interface)的有效使用吗?

转载 作者:行者123 更新时间:2023-11-30 16:04:41 25 4
gpt4 key购买 nike

我想封装解压缩 zip 文件、使文件可供使用、然后在不再需要时自动清理它们的过程。我用一个实现了 IDisposable 接口(interface)的类来做到这一点,这样我就可以用“using”来实例化它,当超出范围时文件将被清理,从而无需专门删除文件。类(class),TempUnzip , 因此可以这样使用:

    static void AccessZipFileContents(string zipFilePath)
{
using (var temp = new TempUnzip(zipFilePath)
{
var tempPath = temp.TempPath;
if (tempPath != null)
{
// read/use the files in tempPath
}
} // files automatically get deleted when it goes out of scope! Woohoo!
}

下面是 TempUnzip 类的实现:

using System.IO;
using System.IO.Compression;
public class TempUnzip : IDisposable
{
public TempUnzip(string zipFilePath)
{
try
{
var tempFolderName = Path.GetRandomFileName();
var tempFolder = Path.GetTempPath();
var tempPath = Path.Combine(tempFolder, tempFolderName);
Directory.CreateDirectory(tempPath);
ZipFile.ExtractToDirectory(zipFilePath, tempPath);
TempPath = tempPath;
}
catch (Exception) { TempPath = null; }
}

public readonly string TempPath;

public void Dispose()
{
try
{
if (TempPath != null)
Directory.Delete(TempPath);
}
catch (Exception) { }
}
}

这是对 IDisposable 的有效使用吗?

  • 如果是这样,我需要实现 the full standard IDisposable pattern? 吗?

  • 如果不是,是否有更好的方法来封装文件的创建和销毁,使其与对象的生命周期相关联,或者我应该完全避免这种情况?

最佳答案

这是对 IDisposable 的有效使用吗?

来自documentation :

Provides a mechanism for releasing unmanaged resources.

本地磁盘上的文件当然是非托管资源。因此,这种用法符合 IDisposable 的既定目的。

如果是这样,我是否需要实现完整的标准 IDisposable 模式?

可以。需要考虑有关终结器的常见注意事项,但您已经链接到那些。它肯定不会造成伤害。

如果没有,是否有更好的方法来封装文件的创建和销毁,使其与对象的生命周期相关联,或者我应该完全避免这种情况吗?

我也喜欢用函数式方法来解决这类问题。这将使您的示例看起来像这样:

static void AccessZipFileContents(string zipFilePath)
{
ZipManager.RunWithZipExtracted(zipFilePath, (string tempPath) =>
{
if (tempPath != null)
{
// read/use the files in tempPath
}
} // files automatically get deleted when it goes out of scope! Woohoo!
}

//from ZipManager.cs...
static void RunWithZipExtracted(string zipLocation, Action<string> toRun)
{
var tempPath = CalculateTempPath();
try
{
ExtractZip(zipLocation, tempPath);
toRun(tempPath);
}
finally
{
DeleteFolder(tempPath);
}
} //private methods left as exercise for the reader

这样的模式避免了“如果他们不调用 Dispose 怎么办?”的问题。完全。

关于c# - 临时解压缩 - 这是对 IDisposable 接口(interface)的有效使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34655363/

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