前言:由于项目需要,CS客户端需要不断更新一些文件(包括可执行程序、动态库和一些数据文件),如果手工拷贝很麻烦,需要实现一个在线检测并自动更新的功能。
思路:在服务器端数据库中建表,存储客户端所有文件的目录和内容(用blob字段)以及修改日期,并用c#编写一个Web服务,客户端编写一个单独的升级检测程序和Web服务通信。
根据文件修改的日期判断,如果有更新的文件则下载并提示覆盖,如果覆盖不了则需要关闭CS客户端然后再覆盖。
实现:数据库表结构(Oracle),表名为UPDATE_FILE_INFO
列名 | 数据类型 | 主键 | 可空 | 说明 |
ID | Number(5) | Y | N | 唯一主键 从1开始 |
APP | Varchar2(20) | N | 应用的名称 | |
NAME | Nvarchar2(256) | N | 文件名 | |
PATH | Nvarchar2(2000) | N | 相对路径 | |
MODIFYTIME | date | N | 修改时间 | |
CONTENT | blob | N | 文件二进制流 | |
REMARK | Nvarchar2(2000) | Y | 备注 | |
Web服务:
数据结构:
文件更新信息类:
Public class UpdateFileInfo
{
Public int id;
Public string name;
Public string path;
Public DateTime modifytime;
Public string remark;
}
函数:
获取所有文件的信息
List<UpdateFileInfo> GetAllFileInfo(string app);
参数:app应用的名称,一般是固定一个名称。
返回值:返回所有文件信息的列表,没有则返回空
获取一个文件的二进制流
Byte[] GetFileContent(int id);
参数:id文件的ID
返回值:文件的二进制流
上传一个文件
int UploadFile(string name, string path, datetime modifytime, string remark, string app,
byte[] content);
参数:name文件名称 path文件相对路径 modifytime文件的更新时间 remark 备注app应用名称 content文件二进制流
返回值:返回值小于1则出错。大于1表示文件的ID
注:如果数据库中有对应的name和path则更新文件内容和日期,如果没有则新增一条记录。
客户端:客户端管理员用户具有上传文件的功能,普通用户只有下载文件的功能。客户端首先获取所有文件的信息列表,然后判断是否有需要更新的文件,如果有更新则将现有文件覆盖。记录没有覆盖的文件显示给用户,用户决定是关闭文档还是程序,然后继续更新。
客户端是一个Windows应用程序, CS启动或者CS定时运行的时候就启动该程序(加入命令行参数),如果没有更新直接退出,有更新则进行更新。如果没有命令行参数运行则具有上传文件功能。
暂时就想到这么多,先做着吧,时间比较紧。大家有什么建议或者意见欢迎提出。