放弃流/文件的所有权

时间:2012-07-25 10:51:02

标签: c# mono stream

在使用单声道流处理时,我遇到了一个非常奇怪的问题。 我打开这样的流:

_stream = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);

其中_stream当然是FileStream。我为这个类添加了一个dispose方法:

public override void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

private void Dispose(bool disposing)
{
    if(!_disposed)
    {
        if(disposing)
        {
            _stream.Flush(true);
            _stream.Dispose();
            _items.Clear();
        }
        _disposed = true;
    }
}

现在我有了这个简单的测试:

[Test]
public void SimpleTest()
{
    SyncFileWriter s = new SyncFileWriter("file");
    s.Save("a", "b");
    s.Dispose();

    SyncFileWriter s2 = new SyncFileWriter("file");
    s2.Dispose();
}

但如果失败并出现IOException:共享违规。 [编辑]看起来monodevelop有错误。重新启动它,现在每次都失败[/ edit]

如何避免这种情况并正确关闭流?

2 个答案:

答案 0 :(得分:0)

看起来这是我的错。 SyncFileWriter派生自一个抽象类,用于检查文件是否存在。如果没有,它会用一些默认的东西初始化这个文件,这就是我做以下的原因

File.Create(filename);

如您所见,我创建了一个文件,但是File.Create打开了一个流,并且在离开它的范围之后不会关闭它。 现在我这样做:

Filestream f = File.Create(filename);
...
f.Dispose();

一切都很好。

我认为这也是第一个非确定性行为的问题,因为它仅在参数为空时执行此操作,并且在创建新文件时仅为空。

无论如何,谢谢你的帮助!

答案 1 :(得分:-1)

不太确定您要实现的目标,但我想这可能会有所帮助:http://www.blackwasp.co.uk/UsingStatement.aspx