我有一个应用程序,通过我拍照并按下保存按钮并将图像保存到计算机。这在大多数情况下都可以正常工作。但我看到一些用户的图像已损坏。这些图像大小与正确的字节数有关,但在尝试图像的字节时,它只是一个空值的加载。
我保存照片的代码是:
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之外的其他方法。
但我不确定这意味着什么?我的用户可以在写文件时让他们的平板电脑进入睡眠状态吗?还有什么其他原因会发生这种情况?
答案 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,这将刷新中间文件缓冲区。