C# 使用C++;流的标准

C# 使用C++;流的标准,c#,c++,monitoring,C#,C++,Monitoring,我正在尝试为正在使用的windows服务向内部测试实用程序添加日志监视器。该服务是用C++编写的(Win32),实用程序在.NET(C**)

我正在尝试为正在使用的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 fsw = new FileSystemWatcher(@"C:\", "mylog.log");
fsw.Changed += new FileSystemEventHandler(fsw_Handler);
fsw.EnableRaisingEvents = true;
但对于该服务,在更新日志时,它从未获得任何更改事件。我发现我在网上遇到的任何使用FileSystemWatcher的示例代码都有同样的问题。。。 但是,我知道这些事件应该是可用的,因为其他日志监视器应用程序(如)可以很好地处理服务日志文件


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

如果您将服务作为一个普通的旧exe运行,它会工作吗?这可能是一个用户帐户问题吗?

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

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

有两个想法:

首先,确保您的FileSystemWatcher以完全信任的方式运行。尝试在初始化观察程序的方法上设置此选项:

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
有关示例,请参见MSDN上的示例代码

如果不起作用,请尝试使用以下方法打开文件:

std::ofstream logFile;
logFile.open("C:\\mylog.log", ios::out, filebuf::sh_read);

可能是您正在锁定文件,这(出于某种原因)会阻止文件系统监视程序在您写入时看到对文件的更改。

是否尝试过设置

        fsw.NotifyFilter = NotifyFilters.LastWrite;

或者其他过滤器?

我真的很想能够从前面的答案中选择一个作为“答案”,但所有这些都有助于我找到最终的解决方案

在对每个解决方案进行了大量的尝试和错误之后,我发现可以通过将NoTIFYFILE设置为:

,使其能够工作(而不修改C++日志代码)。
NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Size | NotifyFilters.CreationTime;
我有点假设默认情况下它会搜索所有的东西,但显然不是。总的来说,我认为最有帮助的过滤器是“尺寸”。LastAccess工作得更好,但它并不总是能接受每一个变化。。。这有点取决于观察者发射的时间。但是尺寸让它看到了所有的变化


谢谢大家的帮助!因为我不能只选择一个答案,所以我努力做到公平,并确保对您的每个答案都进行投票。

我通过将IncludeSubdirectories设置为“true”解决了这个问题


我查看的目录没有任何子目录,但这解决了问题…

不确定…如果不进行大量修改,服务将无法自行运行,因此我很难进行测试。虽然服务上已启用“与桌面交互”。。。另外,BareTail很好地更新了日志……当然,它可能是用C编写的……但仍然……您必须为filebuf::sh_read指定名称空间吗?我在编译时得到:错误C2039:“sh_read”:不是“std::basic_filebuf”的成员如果您在windows上,我相信您可以包含“fstream.h”(vs)并使其正常工作。它不是STD C++ LIBS的一部分,因为它与Windows文件系统调用有些关系。没有进行“FStur.h”,说它找不到那个文件。奇怪的是,这就是我所得到的。我在打开文件时收到一个更改的事件,然后在关闭文件时再次收到。只是为了检查和处理监视器(sysinternals)是否接收到WriteFile操作。。。所以我知道我应该能够看到它们……不公平:)我的答案是最接近的,因为是过滤器导致了问题,并为您找到了解决方案:)。。很好,你让它工作了