我最近“转换”,或者更确切地说,我的方法导入到默认的Windows服务模板。 没有语法错误,编译好了,但FileSystemWatcher方法由于某种原因不能正常工作,例如,在正常运行时,它会写入已经创build到process.lst的所有进程,但是作为服务运行时,它不会执行这(也许是与工作目录,因为它的服务?):
namespace WindowsService { class WindowsService : ServiceBase { /// <summary> /// Public Constructor for WindowsService. /// - Put all of your Initialization code here. /// </summary> public WindowsService() { this.ServiceName = "My Service"; this.EventLog.Source = "My Service"; this.EventLog.Log = "Application"; // These Flags set whether or not to handle that specific // type of event. Set to true if you need it, false otherwise. this.CanHandlePowerEvent = true; this.CanHandleSessionChangeEvent = true; this.CanPauseAndContinue = true; this.CanShutdown = true; this.CanStop = true; if (!EventLog.SourceExists("My Service")) EventLog.CreateEventSource("My Service", "Application"); } /// <summary> /// The Main Thread: This is where your Service is Run. /// </summary> static void Main() { ServiceBase.Run(new WindowsService()); // This checks for any existing running instances, if found the proess is terminated immidieately. if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return; DisplayInfo(); string dirPath = "C:\\"; FileSystemWatcher fileWatcher = new FileSystemWatcher(dirPath); fileWatcher.IncludeSubdirectories = true; fileWatcher.Filter = "*.exe"; // fileWatcher.Filter = "C:\\$Recycle.Bin"; // fileWatcher.Changed += new FileSystemEventHandler(FileWatcher_Changed); fileWatcher.Created += new FileSystemEventHandler(FileWatcher_Created); // fileWatcher.Deleted += new FileSystemEventHandler(FileWatcher_Deleted); // fileWatcher.Renamed += new RenamedEventHandler(FileWatcher_Renamed); fileWatcher.EnableRaisingEvents = true; // updated code while (true) { CleanUpDel(); StartRemoveDuplicate(); CompareFiles(); bool changes = ScanFileChanges(); if (!changes) { TrimColon("process_trim.lst", "process_trimmed.lst"); TrimWipe(); AddTMPIgnore(); SendAlert(); CompareOrig(); } Thread.Sleep(10000); } } private static void AddTMPIgnore() { var myString = File.ReadAllText("process_final.lst"); File.AppendAllText("ignore_temp.lst", myString); } static void FileWatcher_Created(object sender, FileSystemEventArgs e) { using (StreamWriter fileWriter = new StreamWriter("process.lst", true)) { var data = true; fileWriter.Write("C:\\" + e.Name + Environment.NewLine); } }
我已经完成了最后一次服务的时间很长,所以我只记得含糊不清,但是:
有一个OnStart和一个OnStop方法。 在此之内,你必须创建一个新的线程来完成这项工作。 您可以使用BackgroundWorker或创建一个System.Threading.Thread。 当我正确地解释你的代码时,你在Main方法中进行处理。 这是不允许的。 该服务将无法正确初始化。 构造函数不是做这个的地方。
也请确定,如果调用OnStop,处理逻辑确实停止。 否则服务控制管理器将不会喜欢你的服务。
您的服务可能没有写入文件的权限,或者将文件放在您不希望的地方。