gpt4 book ai didi

c# - 尽管采取了措施,FileSystemWatcher 事件仍会引发两次

转载 作者:太空狗 更新时间:2023-10-30 00:24:40 26 4
gpt4 key购买 nike

我在这里和其他网站上浏览了很多主题以寻找解决此问题的方法。

这是我的 FileMonitor 类:

class FileMonitor
{
public FileMonitor(String path)
{
try
{
var watcher = new FileSystemWatcher()
{
Path = path,
IncludeSubdirectories = true,
InternalBufferSize = 65536,
EnableRaisingEvents = true
};

watcher.Changed += new FileSystemEventHandler(OnFileChanged);
watcher.Created += new FileSystemEventHandler(OnFileCreated);
watcher.Deleted += new FileSystemEventHandler(OnFileDeleted);
watcher.Renamed += new RenamedEventHandler(OnFileRenamed);
watcher.Error += new ErrorEventHandler(OnWatcherError);
}
catch (Exception)
{

throw;
}
}

private void OnWatcherError(object sender, ErrorEventArgs e)
{

}

private void OnFileChanged(object sender, FileSystemEventArgs e)
{
try
{
((FileSystemWatcher)sender).EnableRaisingEvents = false;

LogFileSystemChanges(e);
}

finally
{
((FileSystemWatcher)sender).EnableRaisingEvents = true;
}
}

private void OnFileCreated(object sender, FileSystemEventArgs e)
{
try
{
((FileSystemWatcher)sender).EnableRaisingEvents = false;

LogFileSystemChanges(e);
}

finally
{
((FileSystemWatcher)sender).EnableRaisingEvents = true;
}
}

private void OnFileDeleted(object sender, FileSystemEventArgs e)
{
try
{
((FileSystemWatcher)sender).EnableRaisingEvents = false;

LogFileSystemChanges(e);
}

finally
{
((FileSystemWatcher)sender).EnableRaisingEvents = true;
}
}

private void OnFileRenamed(object sender, RenamedEventArgs e)
{
try
{
((FileSystemWatcher)sender).EnableRaisingEvents = false;

LogFileSystemRenaming(e);
}

finally
{
((FileSystemWatcher)sender).EnableRaisingEvents = true;
}
}

private void LogFileSystemChanges(FileSystemEventArgs e)
{
string log = string.Format("{0:G}: {1} | {2}", DateTime.Now, e.FullPath, e.ChangeType);
Console.WriteLine(log);
}

private void LogFileSystemRenaming(RenamedEventArgs e)
{
string log = string.Format("{0:G}: {1} | Old name: {2}", DateTime.Now, e.FullPath, e.OldName);
Console.WriteLine(log);
}
}

如您所知,我已经尝试了 ((FileSystemWatcher)sender).EnableRaisingEvents = false; 的“锁定”,但我可以从控制台输出中得知我的事件触发了两次。

对此有什么想法吗?我真的不确定从这里到哪里去。

最佳答案

我遇到了同样的问题,经过一番折腾后得出的结论是,记事本 将一个文件连续写入了三次 (!)。如果一个应用程序真的经常保存那么多(也许是三角备份等),那么您无能为力。

我还注意到您已附加到所有事件,您应该将其缩小到您需要的最低限度,并使用 NotifyFilters 过滤掉您不感兴趣的那些.

关于c# - 尽管采取了措施,FileSystemWatcher 事件仍会引发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22767413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com