0

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

我保存照片的代码是:

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 还持有句柄时读取、写入或查找可能会导致数据损坏。为了数据安全,请在使用句柄之前调用 Flush,并避免在使用句柄后调用除 Close 之外的任何方法。

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

4

1 回答 1

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,这将刷新中间文件缓冲区。

于 2015-02-04T09:32:27.077 回答