读取不断从游戏服务器获取新数据的日志文件

时间:2011-06-22 15:01:41

标签: c#

我目前正在为游戏服务器创建一个报告机器人。游戏服务器是使命召唤4.这个游戏服务器将所有游戏内事件写入默认games_mp.log调用的.log文件。游戏服务器会不断打开此文件,直到您关闭游戏服务器。 现在,使用FileShare.ReadWrite时这不应该是一个问题,以便覆盖该部分。 我想要的是,我读取了添加到此日志文件中的新行,此时它被游戏服务器添加并放置在IRC中。

IRC部分我已经启动并运行,但读取日志文件部分对我不起作用。我已经尝试了几个像filesystemwatcher这样的东西,但这个似乎没有用。它只在服务器关闭后才读取文件。虽然日志文件确实为事实从服务器上发生的事情中获取新数据。 (希望我现在不要混淆你:))

所以我想要做的是这样的: 不断读取日志文件。游戏服务器很快就会在日志文件中添加一个新行,并在IRC上发布。当然是格式化它并首先检查是否是我希望在IRC上发布的数据,但首先我想让阅读部分工作。

这是我在使用Filesystemwatcher时使用的代码的一部分:

FileSystemWatcher watcher = new FileSystemWatcher();

    private void watching()
    {
        watcher.Path = @"D:\Games\Call of Duty 4 - Modern Warfare\main";
        watcher.Filter = "games_mp.log";
        watcher.Changed += new FileSystemEventHandler(watcher_Changed);
        watcher.EnableRaisingEvents = true;
    }

    private void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        ReadNewData();
    }

    private void ReadNewData()
    {
        string line = string.Empty;
        FileStream file = new FileStream(  @"D:\Games\Call of Duty 4 - Modern Warfare\main\games_mp123.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        file.Seek(previousEndPosition, SeekOrigin.Begin);
        TextReader reader = new StreamReader( file);
        while( (line = reader.ReadLine()) != null)
        {
            IRCClass.client.SendChat(line, "#CodTest");
        }
        previousEndPosition = file.Position;
    }

希望有人可以帮助我。

PimDröge

1 个答案:

答案 0 :(得分:0)

我认为你的意思是当你说:

时,游戏服务器会关闭
  

只在服务器关闭后才读取文件

如果与游戏服务器断开连接会怎样? FileSystemWatcher.Changed事件是否会触发?

可能是服务器保持日志文件打开而不关闭文件流并引发FileSystemWatcher.Changed事件的方式。

您是否尝试使用NotifyFilter.Size触发?即:

watcher.NotifyFilter = NotifyFilters.Size;

默认使用LastWrite, FileName, DirectoryName。因此,如果由于某种原因,LastWrite没有被更新但是大小是,它将触发。

要进一步诊断它,您可以使用计时器中的FileInfo对象检查文件属性,以记录您要通知的属性,并验证它们是否按预期更改。但是,如果实际更改了NotifyProperty,则会触发FileSystemWatcher.Changed事件。我的猜测是外部服务器端的文件系统机制,在关闭之前不会完全刷新文件。