2011-06-22 40 views
4

我目前正在为游戏服务器创建报告机器人。游戏服务器是“使命召唤4”。该游戏服务器将所有游戏内事件写入默认情况下调用的.log文件games_mp.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; 
    } 

希望有人能帮助我。

皮姆Dröge

回答

0

我想你指的是游戏服务器关闭时,你说:

一旦服务器被关闭

连接是否会发生什么事,只读取文件与游戏服务器断了? FileSystemWatcher.Changed事件是否触发?

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

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

watcher.NotifyFilter = NotifyFilters.Size; 

默认情况下它使用LastWrite, FileName, DirectoryName。所以如果由于某种原因,LastWrite没有被更新,但尺寸是,它会触发。

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

+0

尚未尝试使用文件大小通知过滤器。我会给它一个去,让你知道它是否工作。无论如何感谢您的帮助 –

+0

我已经给大小一个尝试,它实际上部分工作。现在,只有当我单击浏览器中的实际文件时,它才会触发更改事件BUT。也许我仍然做错了什么?我检查过fileinfo对象,size属性正在更新,因为它应该。 lastwrite特性不是这样的,为什么它以前失败了。有什么建议么? –

+0

现在我找到了一个解决方法。我现在复制原始文件,并且每隔100毫秒将其重命名为一个计时器,并让文件系统监视器监视复制的文件。这样它似乎工作。然而,这不是一个理想的方式。所以,如果你有其他的建议或者完全不同的方法,我全都是耳朵。 –