有另一种进程正在读取时写入文件的方法吗?

时间:2016-01-22 05:09:45

标签: c# c++ file-access

我在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 ++中找不到相似的方法。

1 个答案:

答案 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拒绝对该文件的写访问权。

MSDN有the documentation and examples

相关问题