2

我有两个程序可以读取和写入同一个文件。一个附加数据,另一个清除文件,然后重写所有数据。

这两个程序在同一台计算机上可以正常交互,但是当我在另一台计算机上运行一个程序并通过本地网络打开文件时,我的追加似乎没有及时通过。

我的流程如下:

方案一:

  • 打开文件

    handle = CreateFile(str.c_str(),
             FILE_READ_DATA|FILE_APPEND_DATA,
             0,
             NULL,
             OPEN_ALWAYS,
             FILE_ATTRIBUTE_NORMAL,
             NULL);
    
  • 使用以下方式写入数据:

    WriteFile(handle, line, strlen(line), &Written, NULL);
    
  • 使用以下方法关闭文件:

    CloseHandle(handle);
    

方案二:

  • 使用以下命令打开文件:

    handle = CreateFile(str.c_str(),
             FILE_READ_DATA|FILE_WRITE_DATA,
             0,
             NULL,
             OPEN_ALWAYS,
             FILE_ATTRIBUTE_NORMAL,
             NULL);
    
  • 如果文件大小与上次读取时不同,则使用:

    size = GetFileSize(handle, &size_high);
    

    (我在这里只看大小,忽略 size_high 因为文件大小相对较小))然后关闭文件,使用 FILE_READ_DATA 标志打​​开它,重新加载数据,然后从上一步重试。

  • 否则使用以下命令清除文件数据:

    SetFilePointer(handle,0,NULL,FILE_BEGIN); 
    SetEndOfFile(handle); 
    
  • 使用以下方法重写所有数据:

    WriteFile(handle, line, strlen(line), &Written, NULL);
    
  • 使用以下方法关闭文件:

    CloseHandle(handle)
    

如果文件被另一个程序锁定,程序 1 会提示用户重试保存。如果文件被另一个程序锁定,程序 2 会重试几次。

看起来当通过网络访问文件时,程序 1 中的附加操作在程序 2 清除并重写其数据之前没有被程序 2 拾取。我尝试在设置了 FILE_FLAG_WRITE_THROUGH 标志的情况下打开程序 1 中的文件,并在关闭文件之前使用 FlushFileBuffers(handle) 没有运气。

在这个过程中我有什么遗漏吗?

如果有帮助,我正在 Embarcadero C++ Studio 中编码。

谢谢你的时间。

4

1 回答 1

4

众所周知,文件锁定对于网络共享的文件访问不能可靠和稳健地工作。简单地说,你需要找到另一种机制来实现互斥。例如,使用客户端/服务器数据库设计。

于 2013-01-29T10:41:28.013 回答