您的位置:首页 > 运维架构

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

2015-02-27 09:34 239 查看
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.然后每次执行操作的时候是利用反射去动态加载执行的.

那么更新的话就可以直接从固定路径根据比对程序集的版本等.其他方法来判断是否有最新的程序集下载来更新.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐