我有两个程序可以读取和写入同一个文件。一个追加数据,另一个清除文件,然后重写所有数据。
这两个程序在同一台计算机上交互良好,但是当我在另一台计算机上运行一个程序并通过本地网络打开该文件时,我的附加似乎没有及时通过。
我的流程如下:
程序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 会重试几次。
看起来,当通过网络访问文件时,我在程序 1 中的追加操作在清除并重写其数据之前没有被程序 2 拾取。我尝试在程序 1 中设置 FILE_FLAG_WRITE_THROUGH 标志来打开文件,并在关闭文件之前使用 FlushFileBuffers(handle),但没有成功。
在这个过程中我遗漏了什么吗?
如果有帮助的话,我正在 Embarcadero C++ Studio 中编码。
感谢您的宝贵时间。
最佳答案
已知文件锁定对于网络共享的文件访问不能可靠且稳健地工作。简单来说,就是需要寻找另一种机制来实现互斥。例如,使用客户端/服务器数据库设计。
关于c++ - 通过网络创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14575812/