我正在开发一个应用程序,它跟踪PC上可用驱动器上与目录相关的更改,并将这些更改保存在sqlite DB中。以下代码中的所有内容都按预期正常工作。但是当我通过将大约100个目录及其嵌套目录复制在一起进行测试时,它会冻结应用程序并冻结Windows操作系统的复制过程。
我没有办法管理它,因为批量文件复制的代码占用了大部分PC资源。有什么可以优化它的原因吗?而是设置“IncludeSubDirectories = False”?
class DirWatcher
{
private FileSystemWatcher dirWatcher = null;
public void StartCapture()
{
string[] drives = Environment.GetLogicalDrives();
foreach (string drive in drives)
{
DriveInfo driveInfo = new DriveInfo(drive);
if (driveInfo.DriveType == DriveType.Fixed)
{
//Director Watcher
dirWatcher = new FileSystemWatcher(drive);
dirWatcher.NotifyFilter = NotifyFilters.DirectoryName;
dirWatcher.Created += dirWatcher_Created;
dirWatcher.Deleted += dirWatcher_Created;
dirWatcher.Renamed += dirWatcher_Renamed;
dirWatcher.IncludeSubdirectories = true;
dirWatcher.EnableRaisingEvents = true;
}
}
}
void dirWatcher_Renamed(object sender, RenamedEventArgs e)
{
try
{
Task.Factory.StartNew(() =>
{
saveToDB("Folder",
e.ChangeType.ToString(),
e.FullPath,
Utility.UnixDTstamp(DateTime.Now).ToString(),
Environment.UserName);
});
}
finally
{
dirWatcher.Renamed -= dirWatcher_Renamed;
}
}
void dirWatcher_Created(object sender, FileSystemEventArgs e)
{
try
{
Task.Factory.StartNew(() =>
{
saveToDB("Folder",
e.ChangeType.ToString(),
e.FullPath,
Utility.UnixDTstamp(DateTime.Now).ToString(),
Environment.UserName);
});
}
finally
{
dirWatcher.Created -= dirWatcher_Created;
}
}
public void StopCapture()
{
dirWatcher.IncludeSubdirectories = false;
dirWatcher.EnableRaisingEvents = false;
dirWatcher.Dispose();
}
public void saveToDB(string DirOrFile, string action, string path, string time, string userName)
{
//SavetoDB code will be here.
}
}
}
答案 0 :(得分:0)
可能会减慢(甚至击败)您的程序的一件事是在网络上连接驱动器。我不相信你可以在这些上成功设置Filewatcher,特别是如果驱动程序是基于LINUX的。即使你可以,它也会在性能上变得冰冷
我还发现Filewatcher在观看文件夹层次结构时会错过事件。所以一般来说,我要说你需要找到或写一个替代这个功能,这个功能是如此有缺陷,应该弃用。也许是一个可以让你观看Windows消息循环的钩子?