相关疑难解决方法(0)

在C#和Windows中编写事务性文件?

我有一个数据文件,有时我需要写一个文件的更改.变更包括在多个地方更改信息.例如,更改文件末尾附近的某些数据,并更改启动附近的某些信息.我希望两个单独的写入要么成功要么都失败,否则它将处于不确定状态并且实际上已损坏.在.NET或一般情况下,是否有针对此场景的内置支持?

如果不是那么如何解决这个问题?Windows上的数据库如何解决此问题?

更新:我不想使用事务性NTFS功能,因为它在旧版本的Windows(如XP)上不可用,并且在文件覆盖方案中速度很慢,如上所述.

c# windows transactions file

12
推荐指数
2
解决办法
4033
查看次数

如何取消创建文件

我们假设我正在将数据写入文件句柄:

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)

这种方法存在两个问题:

  1. 有一个竞争条件,有人可以在关闭它之后打开我的文件,但在我删除它之前
  2. 我可能有权 …

error-handling file-io winapi

2
推荐指数
2
解决办法
599
查看次数

标签 统计

c# ×1

error-handling ×1

file ×1

file-io ×1

transactions ×1

winapi ×1

windows ×1