如何停止StreamWriter不创建文件,如果没有写

本文关键字:如果没有 文件 创建 何停止 StreamWriter | 更新日期: 2023-09-27 17:53:28

如果在using语句中使用了Stream Writer,那么即使没有什么可写的,Stream Writer也会创建一个文件,原因是在块的末尾使用块调用dispose方法。

代码

using (StreamWriter sw = new StreamWriter(@"d:'abc.txt"))
{
}

如果没有什么可写的,我不想不创建空白文件。我要找的原因是我们有条件地写日志。

如何停止StreamWriter不创建文件,如果没有写

你可以这样写:

Lazy<StreamWriter> sw = new Lazy<StreamWriter>(() => new StreamWriter(@"d:'abc.txt"));
try
{
    if (something)
    {
        sw.Value.WriteLine("Foo");
    }
}
finally
{
    if (sw.IsValueCreated)
    {
        sw.Value.Dispose();
    }
}

使用Lazy<T>封装StreamWriter

你甚至可以封装Lazy<T>来"处理"IDisposable:

public sealed class DisposableLazy<T> : Lazy<T>, IDisposable where T : IDisposable
{
    public DisposableLazy(Func<T> valueFactory) : base(valueFactory)
    {
    }
    // No unmanaged resources in this class, and it is sealed.
    // No finalizer needed. See http://stackoverflow.com/a/3882819/613130
    public void Dispose()
    {
        if (IsValueCreated)
        {
            Value.Dispose();
        }
    }
}

using (DisposableLazy<StreamWriter> sw = new DisposableLazy<StreamWriter>(() => new StreamWriter(@"d:'abc.txt")))
{
    if (something)
    {
        sw.Value.WriteLine("Foo");
    }
}