gpt4 book ai didi

c++ - Electron :ui和后端进程在Windows上访问相同的日志文件

转载 作者:行者123 更新时间:2023-12-02 10:27:06 24 4
gpt4 key购买 nike

目标
我的基于 Electron 的应用程序使用C++后端,该后端保留一个日志文件。我想在Electron前端的页面上显示文件内容。
macOS版本按预期工作。我只使用node.js的fsreadline库并即时读取文件,然后将已解析的文本插入innerHTML。
问题
但是,在Windows上,日志文件似乎已被后端锁定,而CRT fopen调用使用附加模式“a”。因此,node.js不断获取异常

EBUSY: resource busy or locked open '/path/to/my.log'
更糟糕的是,我使用第三方库进行日志记录,并且内部不容易被黑客入侵。
代码
这是代码的 Electron 端

function OnLoad() {
let logFile = Path.join(__dirname, 'logs', platformDirs[process.platform], 'my.log');

let logElem = document.querySelector('.log');
processLineByLine(logFile, logElem);
}
//
// helpers
//
async function processLineByLine(txtFile, outElement) {
const fileStream = fs.createReadStream(txtFile);

const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
// Note: we use the crlfDelay option to recognize all instances of CR LF
// ('\r\n') in input.txt as a single line break.

for await (const line of rl) {
// Each line in input.txt will be successively available here as `line`.
console.log(`Line from file: ${line}`);
outElement.innerHTML += line + '<br>';
}
}
这是代码的后端
inline bool OpenLogFile(FILE** ppLogFile) {
TCHAR logPath[MAX_PATH];
DWORD length = GetModuleFileName(NULL, logPath, MAX_PATH);
bool isPathValid = false;
#if (NTDDI_VERSION >= NTDDI_WIN8)
PathCchRemoveFileSpec(logPath, MAX_PATH);
HRESULT resPath = PathCchCombine(logPath, MAX_PATH, logPath, TEXT("my.log"));
isPathValid = (resPath == S_OK);
#else
PathRemoveFileSpec(logPath);
LPWSTR resPath = PathCombine(logPath, logPath, TEXT("my.log"));
isPathValid = (resPath != NULL)
#endif
if (!isPathValid)
return false;
errno_t res = _wfopen_s(ppLogFile, logPath, L"a");
if (res != 0) {
wprintf(TEXT("Error: Failed to open log file: %s"), GetOSErrStr().c_str());
}
return res == 0;
}
问题
这是我的体系结构固有的问题吗?
我应该忘记同时从前端/后端进程访问日志文件吗?
我曾考虑过使用消息队列在前端和后端进程之间共享日志,但这会使日志记录变得更加复杂且易于出错。
有没有一种简单的方法来获得与macOS相同的日志记录体验?

最佳答案

我自己解决了。
我必须使用提供更多共享选项的another Win32 API _wfsopen
就我而言,以下更改就足够了

*ppLogFile = _wfsopen(logPath, L"a+", _SH_DENYWR);
This answer帮助了。

关于c++ - Electron :ui和后端进程在Windows上访问相同的日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63899729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com