FileSystemWatcher 作为 Windows 服务使用 Visual Studio 2019
FileSystemWatcher as a Windows Service using Visual Studio 2019
所以,我创建了一个 windows 服务,我在其中使用 FileSystemWatcher
来监视不同的目录。每次检测到更改的文件时,我都会将它们复制到不同的目录中,以便以后使用它们。
当我运行程序作为控制台应用程序.
时,这个工作得很好
当我运行将其作为服务时,我可以正确启动和停止服务,但是它不会检测到任何类型的事件。 我已经尝试调试我的服务,但我发现错误是由于我没有停止 FileSystemWatcher
。
对于我的控制台应用程序,我有 Watch()
方法的代码:
public void Watch()
{
using (FileSystemWatcher watcher = new FileSystemWatcher($"C:\Users\wost\AppData\Roaming\Sublime", _ext))
{
watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
watcher.IncludeSubdirectories = true;
// Add event handlers.
watcher.Changed += OnChanged;
watcher.Created += OnChanged;
watcher.Deleted += OnChanged;
watcher.Renamed += OnRenamed;
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press 'q' to quit the sample.");
while (Console.Read() != 'q') ;
}
}
因此,如果用户按下 'q',我将停止程序。
对于我的 Windows 服务,我有 Watch()
方法的代码:
public void Watch()
{
using (FileSystemWatcher watcher = new FileSystemWatcher($"C:\Users\lashi\AppData\Roaming\Sublime Text 3", _ext))
{
watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
watcher.IncludeSubdirectories = true;
// Add event handlers.
watcher.Changed += OnChanged;
watcher.Created += OnChanged;
watcher.Deleted += OnChanged;
watcher.Renamed += OnRenamed;
// Begin watching.
watcher.EnableRaisingEvents = true;
}
}
所以,这里我根本不停止 FileSystemWatcher
,因为我没有与用户直接交互,所以我不知道如何停止它。你能帮我找到解决办法吗?
这些是 OnStart()
和 OnStop()
方法:
public partial class Service1 : ServiceBase
{
Watcher w;
public Service1()
{
InitializeComponent();
}
protected override void OnStart()
{
w = new Watcher($"C:\EMMC_CACHE\expt1-log", $"C:\EMMC_CACHE\expt1-file", "lashi");
w.Watch();
}
protected override void OnStop()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\Users\wost\Desktop\FILES");
int count = dir.GetFiles().Length;
// TEST
if (count == 0)
{
StreamWriter writer = new StreamWriter(@"C:\Users\wost\Desktop\Notes.txt");
writer.WriteLine("Service is stopped at: " + DateTime.Now);
writer.Close();
}
}
}
我认为你需要让观察者成为一个领域而不是过早地处理它。我没有测试此代码,但您在 'Watch' 中看到了相关更改,我认为....
internal class Watcher : IDisposable {
private FileSystemWatcher _watcher;
private string _directoryPath;
private string _ext;
internal Watcher (string directoryPath, string ext) {
_directoryPath = directoryPath;
_ext = ext;
}
~Watcher () {
Dispose();
}
public void Watch()
{
Dispose();
_watcher = new FileSystemWatcher(_directoryPath, _ext);
_watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
_watcher.IncludeSubdirectories = true;
// Add event handlers.
_watcher.Changed += OnChanged;
_watcher.Created += OnChanged;
_watcher.Deleted += OnChanged;
_watcher.Renamed += OnRenamed;
// Begin watching.
_watcher.EnableRaisingEvents = true;
}
public void Dispose() {
try {
_watcher?.Dispose();
} catch {
;
}
_watcher = null;
}
//FSW event handlers...
}
所以,我创建了一个 windows 服务,我在其中使用 FileSystemWatcher
来监视不同的目录。每次检测到更改的文件时,我都会将它们复制到不同的目录中,以便以后使用它们。
当我运行程序作为控制台应用程序.
时,这个工作得很好当我运行将其作为服务时,我可以正确启动和停止服务,但是它不会检测到任何类型的事件。 我已经尝试调试我的服务,但我发现错误是由于我没有停止 FileSystemWatcher
。
对于我的控制台应用程序,我有 Watch()
方法的代码:
public void Watch()
{
using (FileSystemWatcher watcher = new FileSystemWatcher($"C:\Users\wost\AppData\Roaming\Sublime", _ext))
{
watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
watcher.IncludeSubdirectories = true;
// Add event handlers.
watcher.Changed += OnChanged;
watcher.Created += OnChanged;
watcher.Deleted += OnChanged;
watcher.Renamed += OnRenamed;
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press 'q' to quit the sample.");
while (Console.Read() != 'q') ;
}
}
因此,如果用户按下 'q',我将停止程序。
对于我的 Windows 服务,我有 Watch()
方法的代码:
public void Watch()
{
using (FileSystemWatcher watcher = new FileSystemWatcher($"C:\Users\lashi\AppData\Roaming\Sublime Text 3", _ext))
{
watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
watcher.IncludeSubdirectories = true;
// Add event handlers.
watcher.Changed += OnChanged;
watcher.Created += OnChanged;
watcher.Deleted += OnChanged;
watcher.Renamed += OnRenamed;
// Begin watching.
watcher.EnableRaisingEvents = true;
}
}
所以,这里我根本不停止 FileSystemWatcher
,因为我没有与用户直接交互,所以我不知道如何停止它。你能帮我找到解决办法吗?
这些是 OnStart()
和 OnStop()
方法:
public partial class Service1 : ServiceBase
{
Watcher w;
public Service1()
{
InitializeComponent();
}
protected override void OnStart()
{
w = new Watcher($"C:\EMMC_CACHE\expt1-log", $"C:\EMMC_CACHE\expt1-file", "lashi");
w.Watch();
}
protected override void OnStop()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\Users\wost\Desktop\FILES");
int count = dir.GetFiles().Length;
// TEST
if (count == 0)
{
StreamWriter writer = new StreamWriter(@"C:\Users\wost\Desktop\Notes.txt");
writer.WriteLine("Service is stopped at: " + DateTime.Now);
writer.Close();
}
}
}
我认为你需要让观察者成为一个领域而不是过早地处理它。我没有测试此代码,但您在 'Watch' 中看到了相关更改,我认为....
internal class Watcher : IDisposable {
private FileSystemWatcher _watcher;
private string _directoryPath;
private string _ext;
internal Watcher (string directoryPath, string ext) {
_directoryPath = directoryPath;
_ext = ext;
}
~Watcher () {
Dispose();
}
public void Watch()
{
Dispose();
_watcher = new FileSystemWatcher(_directoryPath, _ext);
_watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
_watcher.IncludeSubdirectories = true;
// Add event handlers.
_watcher.Changed += OnChanged;
_watcher.Created += OnChanged;
_watcher.Deleted += OnChanged;
_watcher.Renamed += OnRenamed;
// Begin watching.
_watcher.EnableRaisingEvents = true;
}
public void Dispose() {
try {
_watcher?.Dispose();
} catch {
;
}
_watcher = null;
}
//FSW event handlers...
}