利用Windows Service,定时监控某一目录,发现新文件后自动上传到指定web服务器

1.创建Windows   Service.打开VS2005.选择新建项目,然后选择Windows   Service就可以创建一个Windows   Service.
    你可以创建一个Windows   Service.设置它是自动启动的.那么它开机就会自动启动,当然安全模式就不会.
    基本上,我想应该满足你的要求.因为大部分的软件是这么做的.
摘自MSDN:
若要创建功能性服务,必须至少:  
设置   ServiceName   属性。  
为服务应用程序创建必需的安装程序。
重写   OnStart   和   OnStop   方法并为其指定代码,以对服务的行为方式进行自定义。
创建   Windows   服务应用程序
创建一个“Windows   服务”项目。  

注意  
有关不使用模板编写服务的说明,请参见如何:以编程方式编写服务。  
 

在“属性”窗口中,设置服务的   ServiceName   属性。  
注意  
ServiceName   属性的值必须始终与安装程序类中记录的名称匹配。如果更改此属性,则必须也更新安装程序类的  

ServiceName   属性。
设置下列所有属性以确定服务的工作机制。
属性     设置    
CanStop  
  True   指示服务将接受停止运行的请求;false   指示禁止停止运行服务。
CanShutdown  
  True   指示服务希望在运行该服务的计算机关闭时收到通知,以便能够调用   OnShutdown   过程。  
CanPauseAndContinue  
  True   指示服务将接受暂停或继续运行的请求;false   指示禁止服务暂停运行和继续运行。  
CanHandlePowerEvent  
  True   指示服务可以处理有关计算机电源状态更改的通知;false   指示禁止服务得到有关这些更改的通知。
AutoLog  
  True   表示在服务执行操作时将信息项写入应用程序的事件日志;false   表示禁用此功能。有关更多信息,请参见如何:记

录关于服务的信息。
注意  
默认情况下,AutoLog   设置为   true。  
注意  
当   CanStop或   CanPauseAndContinue设置为   false   时,“服务控制管理器”会禁用相应的停止、暂停或继续服务的菜单选项

。  
访问代码编辑器,并为   OnStart   和   OnStop   过程填写所需的处理。
重写其他所有要为其定义功能的方法。
添加服务应用程序所必需的安装程序。有关更多信息,请参见如何:将安装程序添加到服务应用程序。  
通过从“生成”菜单中选择“生成解决方案”来生成项目。  
注意  
不要通过按   F5   来运行项目,不能以这种方式运行服务项目。  
安装服务。有关更多信息,请参见如何:安装和卸载服务。
2.FileSystemWatcher.可以在1里面建立的Windows   Service里面添加一个Timer控件来实现.在Timer控件的事件里面去写监控文件夹处理.其实传文件有很多种.你可以直接用WebClient传.也可以如下例子.转成字节数组.那么你想怎么加密都行.比如你可以在字节数组前后添加自己的头和尾标志字节,哈.然后用简单的调用方法传参传到服务器上.如果服务器是WebService.你可以异步调用执行.通过Callback,就是执行成功.就删除本地Txt文件.当然文件传到了WEB服务器就可以很简单的恢复为原来的文件.
public   static   byte[]   File2Bytes(string   filePath)
{
if(filePath.Trim()   ==   String.Empty)
{
MessageBox.Show( "路径有误,请查证! ", "错误: ",   MessageBoxButtons.OK,
MessageBoxIcon.Information);  
return   null;
}
else
{
///   得到文件名,文件扩展名字
string   fileNamePath   =   filePath.Trim();
string   fileName   =   fileNamePath.Substring(fileNamePath.LastIndexOf( "\\ ")   +   1);  

//   要上传的文件
FileStream   fs   =   new   FileStream(fileName,   FileMode.Open,   FileAccess.Read);
BinaryReader   r   =   new   BinaryReader(fs);
byte[]   postArray   =   r.ReadBytes((int)fs.Length);
return   postArray;

///   <summary>  
///上传文件并返回服务器上的文件名
///   </summary>  
///   <param   name= "bytes "> 字节流 </param>
///   <param   name= "fileName "> 客户端的文件名 </param>
/// <param   name= "optFilePath "> 文件存放的服务器路径 </param>  
///   <returns> 服务器上的文件名 </returns>  
[AutoComplete]
public   string   LoadupFile(byte[]   bytes,   string   fileName,   ICMS.EnmOption   optFilePath)
{
BS.SystemManage.Option   option=new   BS.SystemManage.Option();
string   uriString   =   @option.OptionVal(optFilePath);
if(uriString.EndsWith( "\\ ")   ==   false)   uriString   =   uriString   +   "\\ ";
string   fileNameExt   =   fileName.Substring(fileName.LastIndexOf( ". ")   +   1);
DateTime   dt   =   DateTime.Now;
string   strDateTime   =   dt.ToString( "yyMMddHHmmss ");
string   strMilsecond   =   dt.Millisecond.ToString();
fileName   =     strDateTime   +   strMilsecond   +   ". "   +   fileNameExt;                          
uriString   =   uriString   +   fileName;

try
{
WebClient   myWebClient   =   new   WebClient();
myWebClient.Credentials   =   CredentialCache.DefaultCredentials;

Stream   postStream   =   myWebClient.OpenWrite(uriString, "PUT ");
if(postStream.CanWrite)
{      
postStream.Write(bytes,0,bytes.Length);
}
else
{
throw   new   Exception( "文件目前不可写. ");
}
postStream.Close();
}
catch(WebException   we)
{
throw   new   Exception(we.Message);
}
return   fileName;
}

///   <summary>  
///文件下载转成字节流
///   </summary>  
///   <param   name= "fileName "> 服务器上的文件名 </param>  
///   <param   name= "optFilePath "> 文件存放的服务器路径 </param>  
///   <returns> 字节流 </returns>  
[AutoComplete]
public   byte[]   DownLoadFile(string     fileName,   ICMS.EnmOption   optFilePath)
{
BS.SystemManage.Option   option=new   BS.SystemManage.Option();
string   uriString   =   @option.OptionVal(optFilePath);
string   fileFullName   =   uriString   +   "\\ "   +   fileName.Trim();
if(!File.Exists(fileFullName))
{
return   null;
}
else
{
//   得到服务器上要下载的文件流
FileStream   fs   =   new   FileStream(fileFullName,   FileMode.Open,   FileAccess.Read);
BinaryReader   r   =   new   BinaryReader(fs);
byte[]   postArray   =   r.ReadBytes((int)fs.Length);
return   postArray;
}
}
 
3.利用Timer控件定时让Windows   Service从Web服务器获取信息写到Client.
    实现Windows   Service自动更新.有一种方法可以用.不算最好的,不过是可行的.
    你的Windows   Service执行的功能操作写成一个dll.然后每次执行操作的时候是利用反射去动态加载执行的.
    那么更新的话就可以直接从固定路径根据比对程序集的版本等.其他方法来判断是否有最新的程序集下载来更新.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值