1

我有一个类在构造函数中创建一个隐藏文件并保持FileStream打开状态直到Dispose()被调用。调用Dispose()关闭流并删除隐藏文件。

如果程序在没有调用Dispose(). 我想我可以检查它是否仍然存在并File.Delete(path)在析构函数中调用它,但是在调用析构函数时已经可以收集保存文件路径的字符串字段,对吗?

有没有从析构函数访问该字段的安全方法?
如果没有,我还有其他方法可以确保删除该文件吗?

4

3 回答 3

2

但是保存文件路径的字符串字段在调用析构函数时已经可以收集,对吗?

不会。那个字符串仍然存在并且可以安全使用。

但是您必须谨慎操作,如果文件仍处于打开状态,请先关闭文件。

如果程序在没有调用 Dispose() 的情况下关闭,我需要确保删除该文件

这是最大的挑战。这里没有太多保证。确保客户端代码始终调用 Dispose()。

于 2012-10-15T13:24:37.403 回答
1

我相信您可以简单地覆盖Finalize()您正在使用的类的方法。根据这篇 MSDN 文章

析构函数隐式调用对象基类的 Finalize。因此,前面的析构函数代码被隐式翻译成如下代码:

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

在使用该Finalize()方法时,您还可以确保尚未“收集”任何字段,因此您可以安全地使用对象的所有字段。

于 2012-10-15T13:24:26.817 回答
0

如果您的进程将崩溃或被终止,则不会调用 Dispose() 方法。您应该测试某个文件是否被其他进程锁定,而不是在文件存在时休息

于 2012-10-15T13:28:13.743 回答