【发布时间】:2021-09-11 00:23:30
【问题描述】:
我在 C# 中有一个FileSystemWatcher 代码,它检测已更改其内容的文件,然后将这些文件复制到指定目录(C:\Users\wost\Desktop\Data\files)。复制文件后,FileSystemWatcher 停止后,我想加密这些文件,我想在同一个程序中执行此操作。
所以我在主程序中有如下代码:
Watcher w = new Watcher(lexpt, fexpt, userName);
w.Watch();
// Function which encrypts the files
Encryption.EncryptFiles(@"C:\Users\wost\Desktop\Data\files");
这不起作用,因为FileSystemWatcher 永远不会停止,除非我退出程序。所以,我决定使用一个全局变量Global.serviceRunning,如下面的代码所示,它会阻止FileSystemWatcher 在指定目录中观看:
public void Watch()
{
FileSystemWatcher watcher;
using (watcher = new FileSystemWatcher(
$"C:\\Users\\wost\\AppData\\Roaming\\Sublime Text 3", _ext))
{
// Watch for changes in LastAccess and LastWrite times, and
// the renaming of files or directories.
watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
// Only watch text files.
// watcher.Filter = "*.txt";
watcher.IncludeSubdirectories = true;
// Add event handlers.
watcher.Changed += OnChanged;
watcher.Created += OnChanged;
watcher.Deleted += OnChanged;
watcher.Renamed += OnRenamed;
// Begin watching.
watcher.EnableRaisingEvents = true;
//GLOBAL VARIABLE
while (Global.serviceRunning == true) ;
}
}
我曾尝试在主程序中将此全局变量的值更改为false,但它不起作用。你能帮我找到一种方法来停止FileSystemWatcher,然后加密给定目录中的文件吗?
【问题讨论】:
-
“FileWatcher 永远不会停止,除非我退出程序” -- 嗯?为什么不直接将
EnableRaisingEvents设置回false?或者,如果您不想在禁用FileSystemWatcher对象后再次使用它,只需调用其Dispose()方法即可。当然,像while (Global.serviceRunning == true) ;这样的代码应该从不被使用;这将占用整个 CPU 内核而没有任何用处。但完全不清楚为什么您不只是使用记录在案的正常机制来控制FileSystemWatcher对象。 -
@PeterDuniho 谢谢你的回答!这是我第一次使用 FileSystemWatcher,我不太了解它是如何工作的。
-
@PeterDuniho 你能告诉我我需要在哪里将 EnableRaisingEvents 设置为 false,是在主程序中还是在方法 Watch() 中?谢谢!
-
“我需要在哪里将 EnableRaisingEvents 设置为 false” - 您需要在执行代码时知道不再需要的地方设置它观察文件系统事件。您未能在帖子中解释您的场景的这一方面,因此无法将您指向代码中的确切位置。我怀疑它应该使用
Watch()方法。更有可能的是,在一个事件处理程序中,您知道您已经看到了您正在等待看到的任何内容,并且可以禁用FileSystemWatcher对象。 -
@PeterDuniho 我很抱歉。我以为很清楚。我不想在指定的时刻停止 FileSystemWatcher。我只是想在一段时间后停止它,这样我就可以给它足够的时间来寻找变化。我可以这样做吗?谢谢!
标签: c# multithreading visual-studio encryption filesystemwatcher