I have recently “converted” or rather imported my methods into a default Windows Service template. There are no syntax errors and its compiles ok, but the FileSystemWatcher method is not working for some reason, e.g. when run normally it will write all process that have been created to process.lst, but when running as a service it doesn’t do this (maybe something to do with the working directory, because its a service?):
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);
}
}
It’s quite a while I have done the last service, therefore I only remember vague but:
There is a OnStart and a OnStop method. Within this, you have to create a new thread that does the job. You can use BackgroundWorker or create a System.Threading.Thread.
When I interprete your code right, you do the processing in the Main-method. This is not allowed. The service will not proper initialize. Neither the constructor is the place for doing this.
Make also sure, that if OnStop is called, your processing logic really stops. Otherwise Service Control Manager will not like your service.