我有一个类在构造函数中创建一个隐藏文件并保持FileStream
打开状态直到Dispose()
被调用。调用Dispose()
关闭流并删除隐藏文件。
如果程序在没有调用Dispose()
. 我想我可以检查它是否仍然存在并File.Delete(path)
在析构函数中调用它,但是在调用析构函数时已经可以收集保存文件路径的字符串字段,对吗?
有没有从析构函数访问该字段的安全方法?
如果没有,我还有其他方法可以确保删除该文件吗?
我有一个类在构造函数中创建一个隐藏文件并保持FileStream
打开状态直到Dispose()
被调用。调用Dispose()
关闭流并删除隐藏文件。
如果程序在没有调用Dispose()
. 我想我可以检查它是否仍然存在并File.Delete(path)
在析构函数中调用它,但是在调用析构函数时已经可以收集保存文件路径的字符串字段,对吗?
有没有从析构函数访问该字段的安全方法?
如果没有,我还有其他方法可以确保删除该文件吗?
但是保存文件路径的字符串字段在调用析构函数时已经可以收集,对吗?
不会。那个字符串仍然存在并且可以安全使用。
但是您必须谨慎操作,如果文件仍处于打开状态,请先关闭文件。
如果程序在没有调用 Dispose() 的情况下关闭,我需要确保删除该文件
这是最大的挑战。这里没有太多保证。确保客户端代码始终调用 Dispose()。
我相信您可以简单地覆盖Finalize()
您正在使用的类的方法。根据这篇 MSDN 文章:
析构函数隐式调用对象基类的 Finalize。因此,前面的析构函数代码被隐式翻译成如下代码:
protected override void Finalize()
{
try
{
// Cleanup statements...
}
finally
{
base.Finalize();
}
}
在使用该Finalize()
方法时,您还可以确保尚未“收集”任何字段,因此您可以安全地使用对象的所有字段。
如果您的进程将崩溃或被终止,则不会调用 Dispose() 方法。您应该测试某个文件是否被其他进程锁定,而不是在文件存在时休息