我在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 ++中找不到相似的方法。
答案 0 :(得分:1)
你在Windows上,所以C ++的方式是
CreateFile(.... FILE_SHARE_READ | FILE_SHARE_WRITE, ....)
它返回一个Win32 HANDLE
,这在C ++中不是最容易使用的东西(格式化的I / O没有便利功能)。但您可以将其转换为FILE*
或fstream
。
看到这个问题:
或者,您可以使用shflag
的{{1}}参数或_fsopen()
构造函数的_Prot
参数:
参数shflag是一个由其中一个组成的常量表达式 以下清单常量,在Share.h中定义。
术语定义
fstream
为16位应用程序设置兼容模式。
_SH_COMPAT
允许读写访问。
_SH_DENYNO
拒绝对该文件的读访问权。
_SH_DENYRD
拒绝对文件的读写访问权。
_SH_DENYRW
拒绝对该文件的写访问权。