class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@"M:\Videos\Unsorted");
fw.Created+= fw_Created;
}
static void fw_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("added file {0}", e.Name);
}
}
应该是非常自我解释的。我正在尝试创建一个文件监视器,以便我可以自动为我排序视频...如何让程序永不停止?
我想保持基于控制台的功能,所以我可以调试它,但最终我想删除控制台,让它在后台运行(我想作为服务)。
答案 0 :(得分:22)
也许是这样的:
class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@"M:\Videos\Unsorted");
fw.Changed += fw_Changed;
fw.EnableRaisingEvents = true;
new System.Threading.AutoResetEvent(false).WaitOne();
}
static void fw_Changed(object sender, FileSystemEventArgs e)
{
Console.WriteLine("added file {0}", e.Name);
}
}
<强>更新强>
本着帮助其他可能寻找类似解决方案的人的精神,正如@Mark在评论中所述,还有一种方法可以使用WaitForChanged
类的FileSystemWatcher
方法来解决这个问题:
class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@".");
while (true)
{
Console.WriteLine("added file {0}",
fw.WaitForChanged(WatcherChangeTypes.All).Name);
}
}
}
这样做可以让应用程序无限期地等待(或者等到时间坏了)才能更改文件。
答案 1 :(得分:7)
class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@"M:\Videos\Unsorted");
fw.EnableRaisingEvents = true;
fw.Created += fw_Created;
Console.ReadLine();
}
static void fw_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("added file {0}", e.Name);
}
}
显然只是EnableRaisingEvents
。
找到另一个可能更好的解决方案:
class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@"M:\Videos\Unsorted");
fw.Created += fw_Created;
while(true) fw.WaitForChanged(WatcherChangeTypes.All);
}
static void fw_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("added file {0}", e.Name);
}
}
答案 2 :(得分:2)
你可以永远等待这个:
System.Threading.Thread.Sleep(-1);
答案 3 :(得分:2)
我遇到了与你完全相同的问题。我所做的是如果使用命令行--console
启动程序,它将提示您按Enter键关闭,如果没有参数,它将作为服务启动。
class MyExampleApp : ServiceBase
{
public static void Main(string[] args)
{
if (args.Length == 1 && args[0].Equals("--console"))
{
new MyExampleApp().ConsoleRun();
}
else
{
ServiceBase.Run(new MyExampleApp());
}
}
private void ConsoleRun()
{
Console.WriteLine(string.Format("{0}::starting...", GetType().FullName));
OnStart(null);
Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName));
Console.ReadLine();
OnStop();
Console.WriteLine(string.Format("{0}::stopped", GetType().FullName));
}
//snip
}
答案 4 :(得分:2)
由于这种情况,控制台应用程序绝不是测试事件的好方法。无论你使用什么方法,它都必须暂停当前线程,在某些while(true)循环中休眠或锁定,这会阻止你的事件被触发或者几乎不可能在事件中命中断点。 如果可以,请使用Windows应用程序。