有没有办法在另一个进程正在读取时写入文件?
问题描述:
我有一个C++应用程序的写入过程,另一个C#应用程序只要文件被更改就连续读取数据。有没有办法在另一个进程正在读取时写入文件?
在C++:
FILE *fp = fopen(result_file, "a");
if (fp) {
// Write some thing
fclose(fp);
}
在C#:
private void Init() {
FileSystemWatcher watcher = new FileSystemWatcher(ResultFolder);
watcher.Changed += new FileSystemEventHandler(OnResultChanged);
watcher.EnableRaisingEvents = true;
}
private void OnResultChanged(object sender, FileSystemEventArgs e) {
if (e.ChangeType == WatcherChangeTypes.Changed) {
// Check file ready to read
// Ready all lines
string[] lines = File.ReadAllLines(e.FullPath);
// Process lines
}
}
但有时在C++无法打开读取文件的代码,我该如何解决?
P/S:我发现在C#我们有办法来共享文件的访问,如下面的命令
File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
但在C找不到类似的方式++。
答
您使用的是Windows,所以C++的办法是
CreateFile(.... FILE_SHARE_READ | FILE_SHARE_WRITE, ....)
它返回一个Win32 HANDLE
,这是不是在C++中使用(有用于格式化的I/O没有方便的功能),最简单的事情。但你可以把它变成FILE*
或fstream
。
看到这个问题:
或者,您可以使用shflag
参数_fsopen()
或fstream
构造的_Prot
参数:
的参数shflag是一个常量表达式由以下其中一个 组成清单常量,在Share.h中定义。
期限 定义
_SH_COMPAT
设置兼容模式为16位应用程序。
_SH_DENYNO
允许读取和写入访问权限。
_SH_DENYRD
拒绝读取文件的访问权限。
_SH_DENYRW
拒绝读取和写入文件的权限。
_SH_DENYWR
拒绝写入文件。
MSDN has the documentation and examples