2016-04-25 52 views
0

我在創建和填充C++應用程序時遇到問題,以便在C++應用程序中仍然打開時由另一個c#應用程序讀取。與C#應用程序不能正常工作的C++ CFile共享?

我創建的文件與行:

txtFile.Open(m_FileName, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite, &e) 

我也用線嘗試:

txtFile.Open(m_FileName, CFile::modeCreate|CFile::modeWrite|CFile::shareDenyNone, &e) 

和:

txtFile.Open(m_FileName, CFile::modeCreate|CFile::modeWrite, &e) 

具有相同的結果。

然後在C#應用程序,我已經試過2種不同的打開文件的方式:

FileStream fs = File.OpenRead(inputfilepath); 
byte[] buffer = new byte[fs.Length]; 
fs.Read(buffer, 0, buffer.Length); 
fs.Close(); 

byte[] buffer; 
using (FileStream stream = new FileStream(inputfilepath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    buffer = new byte[stream.Length]; 
    stream.Read(buffer, 0, buffer.Length); 
} 

兩種方法捕獲錯誤:

該進程無法訪問文件'filename.txt',因爲它正在被另一個進程使用。

C++應用程序創建該文件,然後使用CreateProcess運行c#應用程序。

我期待問題出現在我嘗試讀取文件的c#代碼中,因爲當我在C++應用程序中添加共享權限時,記事本沒有提供任何錯誤,但是當我沒有設置權限時會發生錯誤。

最終我按照我想要的方式使用Soonts的建議來工作。

設置C++文件共享選項:

txtFile.Open(m_FileName, CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite, &e) 

讓C#應用程序讀取該文件,但不能寫入。

在C#應用程序讀取該文件與

using (FileStream stream = new FileStream(inputfilepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 

設置文件訪問權限爲只讀。但將文件共享權限設置爲readwrite,可以在文件被其他應用程序寫入時打開文件。我出錯的地方是文件共享權限只能在文件被打開之前與C++應用程序衝突才能被讀取。所以它不會打開。

回答

0

在C++中,指定的CFile :: shareDenyNone或CFile的:: shareDenyWrite(像你這樣做)

在C#中,指定FileShare.Write或FileShare.ReadWrite。

+0

我想我看到發生了什麼。在我打開文件的c#應用程序中,我將權限設置爲FileShare.Read。這意味着一旦文件打開,c#只允許其他應用程序讀取文件。但由於它已在另一個進程中打開,因此無法將該文件設置爲只讀。所以我得到錯誤。將文件共享設置爲readwrite允許C++保持其寫入權限,並且c#應用程序中的文件共享設置不再與該文件發生衝突,從而使文件可以在沒有錯誤的情況下打開。 – TheEvilMetal