Совместное использование 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.

Другие вопросы по тегам