Есть ли способ записи в файл, пока другой процесс читает?

У меня есть процесс записи в приложении C ++, другое приложение C # читает данные постоянно, когда файл был изменен.

На C ++:

FILE *fp = fopen(result_file, "a");
if (fp) {
// Write some thing
fclose(fp);
}

На C #:

private void Init() {
FileSystemWatcher watcher = new FileSystemWatcher(ResultFolder);
watcher.Changed += new FileSystemEventHandler(OnResultChanged);
watcher.EnableRaisingEvents = true;
}

private void OnResultChanged(object sender, FileSystemEventArgs e) {
if (e.ChangeType == WatcherChangeTypes.Changed) {
// Check file ready to read

// Ready all lines
string[] lines = File.ReadAllLines(e.FullPath);
// Process lines
}
}

Но иногда код на C ++ не может открыть файл для чтения, как я могу это исправить?

P / S: я обнаружил, что на C # у нас есть способ поделиться доступом к файлу, например, команда ниже

File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

Но не могу найти подобный путь в C ++.

0

Решение

Вы находитесь на Windows, поэтому путь C ++

CreateFile(.... FILE_SHARE_READ | FILE_SHARE_WRITE, ....)

Возвращает Win32 HANDLE, что не так просто использовать в C ++ (удобных функций для форматированного ввода / вывода нет). Но вы можете превратить его в FILE* или же fstream,

Смотрите этот вопрос:

Или вы можете использовать shflag параметр _fsopen() или _Prot параметр fstream конструктор:

Аргумент shflag является константным выражением, состоящим из одного из
следующие манифестные константы, определенные в Share.h.

Термин Определение

_SH_COMPAT Устанавливает режим совместимости для 16-битных приложений.

_SH_DENYNO Разрешает чтение и запись.

_SH_DENYRD Запрещает доступ на чтение к файлу.

_SH_DENYRW Запрещает чтение и запись в файл.

_SH_DENYWR Запрещает доступ на запись в файл.

MSDN имеет документация и примеры

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]