我有一个数据文件,有时我需要写一个文件的更改.变更包括在多个地方更改信息.例如,更改文件末尾附近的某些数据,并更改启动附近的某些信息.我希望两个单独的写入要么成功要么都失败,否则它将处于不确定状态并且实际上已损坏.在.NET或一般情况下,是否有针对此场景的内置支持?
如果不是那么如何解决这个问题?Windows上的数据库如何解决此问题?
更新:我不想使用事务性NTFS功能,因为它在旧版本的Windows(如XP)上不可用,并且在文件覆盖方案中速度很慢,如上所述.
我们假设我正在将数据写入文件句柄:
hFile = CreateFile(filename, GENERICREAD | GENERICWRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
//[snip error check]
try
{
if (!WriteFile(hFile, buffer, count, ref bytesWritten, null))
throw new Win32Exception(GetLastError());
}
finally
{
CloseHandle();
}
Run Code Online (Sandbox Code Playgroud)
如果我的数据写入失败,我希望在关闭句柄时删除该文件.即:我希望文件是"un-CreatFile'd".
我已经尝试了显而易见的,如果出现问题则删除文件:
hFile = CreateFile(filename, GENERICREAD | GENERICWRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
//[snip error check]
try
{
try
{
if (!WriteFile(hFile, buffer, count, ref bytesWritten, null))
throw new Win32Exception(GetLastError());
}
finally
{
CloseHandle();
}
}
catch
{
DeleteFile(filename);
throw;
}
Run Code Online (Sandbox Code Playgroud)
这种方法存在两个问题: