Совместное использование C++ CFile с C# App не работает?
У меня возникают проблемы с получением файла, созданного и заполненного приложением C++, для чтения другим приложением C#, пока оно еще открыто в приложении C++.
Я создаю файл со строкой:
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++, но выдает ошибки, когда я не устанавливаю разрешения.
В конце концов я заставил его работать так, как я хотел, с предложением Сунтса.
Установка опции обмена файлами 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))
Устанавливает доступ к файлу только для чтения. Но, установив права доступа к файлу для чтения, можно открыть файл во время записи в другое приложение. Я ошибался, когда разрешения на совместное использование файлов были доступны только для чтения, поскольку они конфликтовали с приложением C++ еще до открытия файла. Так что не откроется.
1 ответ
В C++ укажите CFile::shareDenyNone или CFile::shareDenyWrite (как вы делаете)
В C# укажите FileShare.Write или FileShare.ReadWrite.