首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于网络的CreateFile

基于网络的CreateFile
EN

Stack Overflow用户
提问于 2013-01-29 04:46:34
回答 1查看 936关注 0票数 2

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

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

我的程序如下:

方案1:

  • 打开文件 handle = CreateFile(str.c_str(),FILE_READ_DATA|FILE_APPEND_DATA,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  • 使用以下方法编写数据: WriteFile(句柄,行,strlen(行),和写,NULL);
  • 使用以下方法关闭文件: CloseHandle(手柄);

方案2:

  • 用下列文件打开文件: handle = CreateFile(str.c_str(),FILE_READ_DATA|FILE_WRITE_DATA,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  • 如果文件大小与上次不同,则使用: 大小=GetFileSize(手柄,&size_high); (我在这里只查看大小,因为文件大小相对较小,因此忽略了size_high )然后关闭文件,使用FILE_READ_DATA标志打开它,重新加载数据,然后从前面的步骤重试。
  • 否则,使用以下方法清除文件数据: SetFilePointer(句柄,0,空,FILE_BEGIN);SetEndOfFile(句柄);
  • 使用以下方法重写所有数据: WriteFile(句柄,行,strlen(行),和写,NULL);
  • 使用以下方法关闭文件: CloseHandle(手柄)

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

看起来,当通过网络访问文件时,程序1中的附加操作在清除和重写数据之前不会被程序2捕获。我试着用FILE_FLAG_WRITE_THROUGH标志打开程序1中的文件,并在关闭文件之前使用FlushFileBuffers(句柄)。

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

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

耽误您时间,实在对不起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-29 10:41:28

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14575812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档