通过网络创建文件

时间:2013-01-29 04:46:35

标签: c++ windows winapi

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

这两个程序在同一台计算机上进行了良好的交互,但当我在另一台计算机上运行一个程序并通过我的本地网络打开文件时,我的附件似乎没有及时通过。

我的流程如下:

计划1:

  • 使用

    打开文件
    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);
    

计划2:

  • 打开文件:

    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会重试几次。

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

这个过程中有什么我想念的吗?

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

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

已知文件锁定不能可靠且稳健地用于文件访问网络共享。简而言之,您需要找到另一种机制来实现互斥。例如,使用客户端/服务器数据库设计。