gpt4 book ai didi

c# - 使用 C++ std::ofstream 时,FileSystemWatcher 不会触发

转载 作者:太空狗 更新时间:2023-10-29 23:48:25 26 4
gpt4 key购买 nike

我正在尝试将日志监视器添加到我正在处理的 Windows 服务的内部测试实用程序中。该服务是用 C++ (win32) 编写的,实用程序是用 .NET (C#) 编写的

日志监视器适用于我编写的许多其他 C++ 应用程序,但不适用于我的服务。

我能看到的唯一主要区别是其他应用程序使用较旧的::WriteFile() 输出到日志,而在服务中我使用的是 std::ofstream,如下所示:

std::ofstream logFile;
logFile.open("C:\\mylog.log");
logFile << "Hello World!" << std::endl;
logFile.flush();

在我的实用程序中,我像这样使用 FileSystemWatcher:

FileSystemWatcher fsw = new FileSystemWatcher(@"C:\", "mylog.log");
fsw.Changed += new FileSystemEventHandler(fsw_Handler);
fsw.EnableRaisingEvents = true;

但是对于服务来说,它永远不会在日志更新时收到任何更改事件。我发现我在网上遇到的任何使用 FileSystemWatcher 的示例代码也有同样的问题......但是,我知道这些事件应该是可用的,因为其他日志监控应用程序(如 BareTail)可以很好地处理服务日志文件。

我宁愿让实用程序的 C# 代码正常工作,这样它就可以与任何东西一起工作,但如果我必须更改服务的日志记录代码,我会这样做。有人看到这里出了什么问题吗?

最佳答案

只是一个大胆的猜测,但是当服务实际关闭日志文件时实用程序会触发吗?我问的原因是 Windows 可能不会在调用 std::ofstream::flush() 时更新文件元数据——这有时也会发生在其他操作系统的某些虚拟文件系统实现中。

我还将检查该实用程序是否具有访问服务创建的日志文件的适当权限。如果您以管理员身份运行该服务,则可能必须以同一用户身份运行该实用程序。

关于c# - 使用 C++ std::ofstream 时,FileSystemWatcher 不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/971528/

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