У меня есть процесс записи в приложении 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 ++.
Вы находитесь на 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 имеет документация и примеры
Других решений пока нет …