我目前正在为游戏服务器创建一个报告机器人。游戏服务器是使命召唤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
答案 0 :(得分:0)
我认为你的意思是当你说:
时,游戏服务器会关闭只在服务器关闭后才读取文件
如果与游戏服务器断开连接会怎样? FileSystemWatcher.Changed事件是否会触发?
可能是服务器保持日志文件打开而不关闭文件流并引发FileSystemWatcher.Changed事件的方式。
您是否尝试使用NotifyFilter.Size触发?即:
watcher.NotifyFilter = NotifyFilters.Size;
默认使用LastWrite, FileName, DirectoryName。因此,如果由于某种原因,LastWrite没有被更新但是大小是,它将触发。
要进一步诊断它,您可以使用计时器中的FileInfo对象检查文件属性,以记录您要通知的属性,并验证它们是否按预期更改。但是,如果实际更改了NotifyProperty,则会触发FileSystemWatcher.Changed事件。我的猜测是外部服务器端的文件系统机制,在关闭之前不会完全刷新文件。