2016-04-25 3 views
0

Ich habe Probleme, eine Datei erstellt und mit einer C++ - Anwendung mit einer anderen C# -Anwendung gelesen werden, während es in der C++ - Anwendung geöffnet ist.C++ CFile Freigabe mit C# App funktioniert nicht?

ich erstellen Sie die Datei mit der Zeile:

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

ich auch die Linien versucht haben, mit:

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

und:

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

mit den gleichen Ergebnissen.

Dann in der C# app I 2 verschiedene Möglichkeiten, die Datei öffnen versucht haben:

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

und

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); 
} 

Beide Methoden fangen den Fehler:

Der Prozess nicht zugreifen kann die Datei 'filename.txt', weil sie von einem anderen Prozess verwendet wird.

Die C++ App erstellt die Datei und verwendet dann CreateProcess, um die C# -App auszuführen.

Ich erwarte das Problem in dem C# -Code, wo ich versuche, die Datei zu lesen, da Notepad keine Fehler gibt, wenn ich Freigabeberechtigungen in der C++ App hinzufüge, aber Fehler gibt, wenn ich keine Berechtigungen festlegen.

Am Ende habe ich es so gemacht, wie ich es mit Soontts Vorschlag wollte.

Einstellen der C++ Dateifreigabe Option:

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

Lässt die C# Anwendung die Datei lesen, aber nicht schreiben zu.

in der C# app Lesen Sie die Datei mit:

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

Legt den Dateizugriff nur zu lesen. Wenn Sie jedoch die Dateifreigabeberechtigungen für Lesezugriff festlegen, kann die Datei geöffnet werden, während sie von einer anderen Anwendung geschrieben wird. Wo ich falsch gelaufen bin, war, dass die Dateifreigabeberechtigungen nur gelesen wurden, da sie mit der C++ - Anwendung in Konflikt standen, bevor die Datei überhaupt geöffnet wurde. Also würde es sich nicht öffnen.

Antwort

0

In C++ geben Sie CFile :: shareDenyNone oder CFile :: shareDenyWrite (wie Sie tun)

In C#, geben Sie FileShare.Write oder FileShare.ReadWrite.

+0

Ich denke ich sehe, was passiert ist. In der C# -App, in der ich die Datei öffne, setze ich die Berechtigungen auf FileShare.Read. Das heißt, sobald die Datei geöffnet ist, können andere Apps die Datei nur lesen. Aber da es bereits in einem anderen Prozess geöffnet ist, kann es die Datei nicht zum Lesen festlegen. So bekomme ich den Fehler. Wenn die Dateifreigabe auf "readwrite" gesetzt wird, behält C++ seine Schreibberechtigungen bei, und die Einstellungen für die Dateifreigabe in der C# -App stehen nicht mehr im Konflikt damit, sodass die Datei ohne den Fehler geöffnet werden kann. – TheEvilMetal