快速解释。我有一个游戏服务器,可以在运行时编写控制台.log文件。我正在尝试创建一个在进行新更改时读取文件的事件。
如果我从文本编辑器保存文档,我的更改事件运行良好。但不是当服务器写入它时。
当我在运行时打开日志文件时,我可以看到文档中的所有行都写得很好。
为什么不调用事件?
法典:
class Collect
{
public FileSystemWatcher watcher = new FileSystemWatcher("C:\.q2online\action\logs\");
public Collect()
{
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Filter = "console.log";
watcher.EnableRaisingEvents = true;
}
private static void OnChanged(object scource, FileSystemEventArgs e)
{
Debug.WriteLine(ReadLastLineFromFile(DataContainer.path.Default.logFilePath));
}
几件事。 1. 可以关闭 NTFS 文件系统上的上次访问时间更新。 许多服务器这样做是为了减少文件系统活动。 Windows 还可能延迟长达 1 小时的写入上次访问时间。 因此,根据上次访问获取实时更新通常不可靠。 但是,您正在查看其他属性,因此这可能不是问题,但如果这是您过滤的唯一属性,则会成为问题。
另请注意,在文件系统句柄关闭之前,上次修改时间不会更新。如果您的服务器代码保持句柄打开并且仅附加到文件,则这可能是一个问题。 如果控制服务器端代码,请检查以确保在每次写入后关闭文件句柄。 以下是一篇包含一些有用信息的文章:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724290(v=vs.85).aspx