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