MrG*_*sen 4 .net c# filesystemwatcher
我在这里和其他网站浏览了不少线程,以解决这个问题.
这是我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以告诉我,我已经尝试了"锁定" ((FileSystemWatcher)sender).EnableRaisingEvents = false;,但我可以从我的控制台输出告诉我的事件触发了两次.
有什么想法吗?我真的不确定从哪里开始.
我遇到了同样的问题,经过多次努力得出结论,记事本在行中写了三次(!)文件.如果一个应用程序真的经常保存(可能是对备份进行三角测量等),那么你可以做的事情就不多了.
我还注意到你已经附加了所有事件,你应该将它缩小到你需要的最小范围,并过滤掉那些你对NotifyFilters不感兴趣的东西.
我之前尝试过使用FileSystemWatcher类(事实证明是很多年前 - 2008 年),并且遇到了重大问题。这充其量只是一个有漏洞的抽象。我当时在CodeProject上报告了我的发现。在评论列表中查找“Glytzhkof”。我记得我在课堂上几乎各个方面都存在问题,但这么多年过去了,现在可能已经有所改善了。
总而言之,我当时的经验是,事件完全消失或堆积,导致基于变量的异常,例如磁盘的写入缓存是否启用、是否访问 RAID、NAS 或常规磁盘,以及其他我不知道的随机硬件问题准确地回忆起来。有趣的是,它似乎适用于 UNC 路径。不知道为什么。映射驱动器失败。
查看代码项目讨论中的摘要。我确信自从我尝试以来已经有了一些改进,也许还有一些新的错误:-)。磁盘存储硬件似乎很难作为高级抽象来处理——它会泄漏。就我个人而言,我最终使用服务和常规磁盘功能手动扫描文件。在手动做事情之前我浪费了很多时间。
更新:在此处查看新信息:https ://stackoverflow.com/a/23704476/129130
| 归档时间: |
|
| 查看次数: |
3141 次 |
| 最近记录: |