我正在写一个带有主应用程序可执行文件的日志文件,我还希望附加可执行文件。我从所有可执行文件中正确地打开和写入CreateFileEx,但是当子可执行文件写入该文件(并且成功),然后父exe写入文件后,它不幸地覆盖了孩子写的内容。例如......
1) Parent opens log.
2) Parent writes 'Line A' to log
Log: 'Line a\n'
3) Parent launches child executable
4) Child writes 'Child Line A' to log
Log: 'Line A\nChild Line A\n'
5) Parent writes 'Line B' to log.
Log: 'Line A\nLine B\n
我一直在使用LockFileEx / UnlockFileEx(设置为偏移0和长度MAXDWORD),甚至尝试使用SetFilePointer将指针移动到结尾都没有成功。即在上面的序列中,写等于。
a) LockFileEx
b) SetFilePointer
c) ... write data ...
d) UnlockFileEx
注意:我添加了正确的权限,例如在打开文件时没有缓冲等,甚至尝试FlushFileBuffers都没有成功。
我会假设父文件HANDLE不知道这些更改,因此SetFilePointer(fHandle,0,NULL,FILE_END)认为它已经在最后。
有什么想法吗?
先谢谢 - 蒂姆
答案 0 :(得分:0)
我不确定你的代码有什么问题,你必须提供它的整个实现 - 伪代码描述太少了。我建议不是使用文件锁定,使用普通常规文件附加的互斥,你可以使用包装类CMutexEx和CMutexExHelper,如下所示,日志记录将如下所示:
'='
我不确定这会有多高效,但至少应该是安全的。
CMutexEx和CMutexExHelper的实施:
CMutexEx mtx("myapplogmutex", 250);
CMutexExHelper mthHelper(mtx);
if ( mthHelper.Aquire() ) {
// Log to file, open it and after appending close
}