Monday 30 July 2012

how to create a simple File Watcher Windows Service Application


Introduction

This article will briefly explain how to create a simple "File Watcher” application to run as a Windows Service the coding language used is C#.


Description

Use FileSystemWatcher to watch for changes in a specified directory. You can watch for changes in files and subdirectories of the specified directory. You can create a component to watch files on a local computer, a network drive, or a remote computer.

Another very useful class, FileSystemWatcher, acts as a watchdog for file system changes and raises an event when a change occurs. You must specify a directory to be monitored. The class can monitor changes to subdirectories and files within the specified directory. If you have Windows 2000, you can even monitor a remote system for changes. (Only remote machines running Windows NT or Windows 2000 are supported at present.) The option to monitor files with specific extensions can be set using the Filter property of the FileSystemWatcher class


How to create a simple "File Watcher”

1)   1)  First, open Visual Studio.NET and create a new Windows Service project for C#:
2)    2) I named this sample solution WindowsService and optionally, chose to create a directory  for   the solution file.
3)  3)  Next, an appropriate reference must be added to the project as we will be using an application configuration file. Add a reference to "System.Configuration" by right-clicking on the project, then "Add Reference.”
4)    4) Now, add a new Application Configuration File to the project. We will use this to define a directory (path) to "watch":
5)      I left this named as App.config.
6)      Within the configuration which we've just added, we will need to add an "appSettings" section, where we'll define our directory path:
       <appSettings>
       <add key="FileWatchKey" value="D:\\Data\\" />
       <add key="CreateLogfileLoc" value="D:\\Log\\" />
   appSettings>
7)      We can now set up our code, controls and properties for the actual service.
8)      First, create the main WindowsService component in the Service1.cs file. This can simply be dragged and dropped from the toolbox:
9)              9)   Now we can add ProjectInstaller.cs page  in this page we have added two control
            ServicesInstaller1 and ServicesProcessInstaller1
10      10)  then write code on Service1.cs page like this

using System;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Diagnostics;
usingSystem.Linq;
usingSystem.ServiceProcess;
usingSystem.Text;
using System.IO;
usingSystem.Data.OleDb;
usingSystem.Reflection;
usingSystem.Data.Odbc;
usingMySql.Data.MySqlClient;
usingSystem.Configuration;


namespaceWindowsService
{
public partial class Service1 : ServiceBase
{

StreamWriter str;
FileStream fs = null;
FileSystemWatcher fsw = new FileSystemWatcher(Convert.ToString(System.Configuration.ConfigurationManager.AppSettings["FileWatchKey"]));
publicMySql.Data.MySqlClient.MySqlConnection con;
public Service1()
{
InitializeComponent();
}
protected override voidOnStart(string[] args)
{
fsw.Filter = "*.*";
fsw.EnableRaisingEvents = true;
fsw.Created += new FileSystemEventHandler(fsw_Created);
fsw.Deleted += new FileSystemEventHandler(fsw_Deleted);
fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
}
voidfsw_Renamed(Object sender, RenamedEventArgs e)
{

}
voidfsw_Deleted(Object sender, FileSystemEventArgs e)
{

}
voidfsw_Created(Object sender, FileSystemEventArgs e)
{
stringCreateLogfileLoc = Convert.ToString(System.Configuration.ConfigurationManager.AppSettings["CreateLogfileLoc"]) + "Log" + string.Concat(Convert.ToString(System.DateTime.Now.Day), "-", Convert.ToString(System.DateTime.Now.Month), "-", Convert.ToString(System.DateTime.Now.Year)) + ".txt";
try
{
if (!File.Exists(CreateLogfileLoc))
{
using (fs = File.Create(CreateLogfileLoc))
{
}
}
}
catch (Exception ex)
{
}
try
{

string[] varFile = e.Name.Split('.');
string FileName = Convert.ToString(System.Configuration.ConfigurationManager.
                  AppSettings["FileWatchKey"]) + e.Name;
if ((e.Name == "Report.xls") || (e.Name == "Report.xlsx"))
{
str.WriteLine("A new file " + e.Name + " has been created in " + fsw.Path);
Microsoft.Office.Interop.Excel.Workbook theWorkbook;
Microsoft.Office.Interop.Excel.Worksheet worksheet;
Microsoft.Office.Interop.Excel.Application ExcelObj = null;
Microsoft.Office.Interop.Excel.Range _range;
ExcelObj = new Microsoft.Office.Interop.Excel.Application();
theWorkbook = ExcelObj.Workbooks._Open(FileName, 0, false, 5,
"", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", true, true, 0, true);
Microsoft.Office.Interop.Excel.Sheets sheets = theWorkbook.Worksheets;
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(1);
_range = worksheet.UsedRange;
int colCount = _range.Columns.Count;
int rowCount = _range.Rows.Count;
System.Array myvalues = (System.Array)_range.Cells.Value2;
DataTable dt = new DataTable();
if(myvalues.Length > 0)
{
stringstrConnctivity = string.Empty;
if (rowCount > 1)
{

dt.Rows.Clear();
dt.Columns.Clear();
DataColumn dc1 = new DataColumn("Name");
dt.Columns.Add(dc1);
for (int j = 2; j <= rowCount; j++)
{
try
{
dt.Rows.Add(CheckString(myvalues.GetValue(j, 12)));
}
catch (Exception ex)
{
}
}
}
}
ExcelObj.Workbooks.Close();
ExcelObj.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelObj);
GC.Collect();
GC.WaitForPendingFinalizers();
ExcelObj = null;
str.WriteLine("Report.xls data upload successfully");
}
}
catch (Exception ex)
{
str.WriteLine("Error in : " + e.Name + " .Error Code is:" + ex.Message.ToString());
}
finally
{
str.Flush();
}
}
public string CheckString(objectstr)
{
stringvarconvertValue = Convert.ToString(str);
if(varconvertValue == "NULL")
{
varconvertValue = "0";
}
else if (varconvertValue == "")
{
varconvertValue = "0";
}
returnvarconvertValue;
}
}
}


Downloads  
You can download the complete source code in C# 

0 comments:

Post a Comment

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Powered by Blogger