如何在 C# 中正确使用 FileSystemWatcher -- 多个文件和 Getting "Lazy" on me
How to properly use FileSystemWatcher in C# -- Multiple Files and Getting "Lazy" on me
我正在尝试做的是观察目录中添加的新文件夹。
添加文件夹后,我将标准目录结构从另一个文件夹复制到这个文件夹中,然后使用 Open Office XML 对其中一个 Microsoft Word 文档的内容进行搜索和替换包含在源文件夹中。
一切正常...除了:
1) 如果我将多个文件夹复制到 "watched" 目录,其中一个将被处理,其他 none 将被处理。此外,在那之后,应用程序变得 "stuck" 并且需要重新启动才能再次运行。
2) 出于某种原因,它有时会对我造成 "lazy" 的影响,然后就停止工作了。查看控制台 window 它显示它位于代码的 WaitForChanged
部分,但没有任何反应。这似乎不一致。
这是代码的 FileSystemWatcher 部分(不想让您厌烦 OOXML 和文件夹复制位):
class soClass
{
private const string strDirectory = @"C:\[DIRECTORY-TO-WATCH\]";
private static FileSystemWatcher fw = new FileSystemWatcher(strDirectory);
private static void WatchIt()
{
// WHILE TRUE -- JUST MAKES IT RUN OVER AND OVER AGAIN...
while (true)
{
Console.WriteLine("Waiting on file/folder changes...");
// HANGS HERE ON THE 'REG
string strName = fw.WaitForChanged(WatcherChangeTypes.Created, -1).Name;
Console.WriteLine("File/Folder Added!");
Console.WriteLine("Starting over...");
Console.WriteLine("--------------------------------------------------------");
}
}
}
一如既往,非常感谢您的帮助。
更新:
,这是最终有效的代码
class soClass
{
private const string strDirectory = @"C:\[DIRECTORY-TO-WATCH]";
private static void Main()
{
WatchIt();
}
public static void WatchIt()
{
FileSystemWatcher fw = new FileSystemWatcher();
fw.Path = strDirectory;
fw.Created += new FileSystemEventHandler(OnCreated);
Console.WriteLine("Waiting on file/folder changes...");
// BEGIN WATCHING
fw.EnableRaisingEvents = true;
// WAIT FOR USER TO QUIT THE PROGRAM
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
private static void OnCreated(object sender, FileSystemEventArgs fileSystemEventArgs)
{
Console.WriteLine("File/Folder Added!");
string strName = fileSystemEventArgs.Name;
// DO STUFF HERE!!
Console.WriteLine("Starting over...");
//rwlock.ExitWriteLock();
Console.WriteLine("--------------------------------------------------------");
}
}
在这里也找到了一些帮助:
https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx
来自文档:
This method waits indefinitely until the first change occurs and then
returns.
https://msdn.microsoft.com/en-us/library/67220zhk(v=vs.110).aspx
如果您想收听多个事件,请尝试使用 OnCreated 事件:
var fw = new FileSystemWatcher();
fw.EnableRaisingEvents = true;
fw.Created += OnCreated;
}
private static void OnCreated(object sender, FileSystemEventArgs fileSystemEventArgs)
{
var name = fileSystemEventArgs.Name;
}
实际上,不幸的是它停止工作已经有一段时间了。我见过的唯一纠正方法是处理它并重新启动它。
更多信息:FileSystemWatcher stops catching events
祝你好运。希望有一天他们能解决这个问题。
我正在尝试做的是观察目录中添加的新文件夹。
添加文件夹后,我将标准目录结构从另一个文件夹复制到这个文件夹中,然后使用 Open Office XML 对其中一个 Microsoft Word 文档的内容进行搜索和替换包含在源文件夹中。
一切正常...除了:
1) 如果我将多个文件夹复制到 "watched" 目录,其中一个将被处理,其他 none 将被处理。此外,在那之后,应用程序变得 "stuck" 并且需要重新启动才能再次运行。
2) 出于某种原因,它有时会对我造成 "lazy" 的影响,然后就停止工作了。查看控制台 window 它显示它位于代码的 WaitForChanged
部分,但没有任何反应。这似乎不一致。
这是代码的 FileSystemWatcher 部分(不想让您厌烦 OOXML 和文件夹复制位):
class soClass
{
private const string strDirectory = @"C:\[DIRECTORY-TO-WATCH\]";
private static FileSystemWatcher fw = new FileSystemWatcher(strDirectory);
private static void WatchIt()
{
// WHILE TRUE -- JUST MAKES IT RUN OVER AND OVER AGAIN...
while (true)
{
Console.WriteLine("Waiting on file/folder changes...");
// HANGS HERE ON THE 'REG
string strName = fw.WaitForChanged(WatcherChangeTypes.Created, -1).Name;
Console.WriteLine("File/Folder Added!");
Console.WriteLine("Starting over...");
Console.WriteLine("--------------------------------------------------------");
}
}
}
一如既往,非常感谢您的帮助。
更新:
,这是最终有效的代码class soClass
{
private const string strDirectory = @"C:\[DIRECTORY-TO-WATCH]";
private static void Main()
{
WatchIt();
}
public static void WatchIt()
{
FileSystemWatcher fw = new FileSystemWatcher();
fw.Path = strDirectory;
fw.Created += new FileSystemEventHandler(OnCreated);
Console.WriteLine("Waiting on file/folder changes...");
// BEGIN WATCHING
fw.EnableRaisingEvents = true;
// WAIT FOR USER TO QUIT THE PROGRAM
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
private static void OnCreated(object sender, FileSystemEventArgs fileSystemEventArgs)
{
Console.WriteLine("File/Folder Added!");
string strName = fileSystemEventArgs.Name;
// DO STUFF HERE!!
Console.WriteLine("Starting over...");
//rwlock.ExitWriteLock();
Console.WriteLine("--------------------------------------------------------");
}
}
在这里也找到了一些帮助: https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx
来自文档:
This method waits indefinitely until the first change occurs and then returns.
https://msdn.microsoft.com/en-us/library/67220zhk(v=vs.110).aspx
如果您想收听多个事件,请尝试使用 OnCreated 事件:
var fw = new FileSystemWatcher();
fw.EnableRaisingEvents = true;
fw.Created += OnCreated;
}
private static void OnCreated(object sender, FileSystemEventArgs fileSystemEventArgs)
{
var name = fileSystemEventArgs.Name;
}
实际上,不幸的是它停止工作已经有一段时间了。我见过的唯一纠正方法是处理它并重新启动它。
更多信息:FileSystemWatcher stops catching events
祝你好运。希望有一天他们能解决这个问题。