2016-01-22 56 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

相關問題