使用FileStream保存图像有时会导致文件损坏

时间:2015-02-04 09:11:35

标签: c# filestream corruption bitmapsource jpegbitmapencoder

我有一个应用程序,通过我拍照并按下保存按钮并将图像保存到计算机。这在大多数情况下都可以正常工作。但我看到一些用户的图像已损坏。这些图像大小与正确的字节数有关,但在尝试图像的字节时,它只是一个空值的加载。

我保存照片的代码是:

try
{
    using (FileStream stream = new FileStream(localCopyFileLocation, FileMode.Create))
    {
        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.QualityLevel = quality;
        encoder.Frames.Add(BitmapFrame.Create(photo, null, metadata, null));
        encoder.Save(stream);
    }
}
catch (Exception ex)
{
    //Write to log etc.
}

FileStream Constructor (SafeFileHandle, FileAccess)我读到了这个:

  

调用Close时,句柄也会关闭,文件的句柄也会关闭   计数递减。

     

FileStream假定它具有独占控制权   手柄上方。在FileStream中读取,写入或搜索   持有句柄可能会导致数据损坏。对于数据   安全,在使用手柄之前调用冲洗,并避免呼叫任何   使用完句柄后,除了Close之外的其他方法。

但我不确定这意味着什么?我的用户可以在写文件时让他们的平板电脑进入睡眠状态吗?还有什么其他原因会发生这种情况?

1 个答案:

答案 0 :(得分:1)

澄清一下 - 您需要致电Flush()

调用Close()是不够的。 Close()调用Dispose()执行以下操作

protected override void Dispose(bool disposing)
{
    try
    {
        if (this._handle != null && !this._handle.IsClosed && this._writePos > 0)
        {
            this.FlushWrite(!disposing);
        }
    }
    finally
    {
        if (this._handle != null && !this._handle.IsClosed)
        {
            this._handle.Dispose();
        }
        this._canRead = false;
        this._canWrite = false;
        this._canSeek = false;
        base.Dispose(disposing);
    }
}

另一方面,这是Flush()的作用:

public override void Flush()
{
    this.Flush(false);
}

哪个电话:

public virtual void Flush(bool flushToDisk)
{
    if (this._handle.IsClosed)
    {
        __Error.FileNotOpen();
    }
    this.FlushInternalBuffer();
    if (flushToDisk && this.CanWrite)
    {
        this.FlushOSBuffer();
    }
}

关键(我想,但我不确定)是FlushOSBuffer()

private void FlushOSBuffer()
{
    if (!Win32Native.FlushFileBuffers(this._handle))
    {
        __Error.WinIOError();
    }
}

如果调用Flush()不起作用,请尝试覆盖Flush(true),这将导致调用Win32 API FlushFileBuffers,这将刷新中间文件缓冲区。