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