2016-01-22 98 views
0

我有一个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

您使用的是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

相关问题