.net2.0写的winapp程序,如果用VS自带的ClickOnce发布功能,每次更新时,客户端会自动下载所有的文件。
而我想要的是只下载有更新的文件。MSDN里提到了一种“文件修补”技术(http://msdn.microsoft.com/zh-cn/asp.net/ms404267.aspx)
可以完成这个任务,但没有说具体做法。有哪位大侠研究过,还请指教。
而我想要的是只下载有更新的文件。MSDN里提到了一种“文件修补”技术(http://msdn.microsoft.com/zh-cn/asp.net/ms404267.aspx)
可以完成这个任务,但没有说具体做法。有哪位大侠研究过,还请指教。
既然MSDN里明确提出了可以做到,我想大家还是一起研究研究吧,很有价值。
//防止ClickOnce更新的数据文件列表
static readonly string[] NOTUPDATEFILENAMES = new string[] { "OBUCardIssueInfo.xml", "OBUSecondIssueInfo.xml", "CPUCardMenu.xml", "CPUCardIssueInfo.xml" };
/// <summary>
/// 防止ClickOnce更新覆盖掉旧的数据文件
/// </summary>
static void AntiUpdateLoacelDataFile()
{
DirectoryInfo lastupadtedirinfo = new DirectoryInfo(Application.StartupPath);
//ClickOnce部署目录的前缀
string clickonedirpre = string.Concat(Application.ProductName.Substring(0, 4), "..").ToLower();
//如果不是ClickOnce部署
if (!lastupadtedirinfo.Name.ToLower().StartsWith(clickonedirpre))
{
return;
}
DirectoryInfo[] allupdatadirinfo = lastupadtedirinfo.Parent.GetDirectories(string.Concat(clickonedirpre, "*"), SearchOption.TopDirectoryOnly);
DirectoryInfo preupadtedirinfo = null;
DateTime mindatetime = DateTime.MinValue;
foreach (DirectoryInfo updatafilesinfo in allupdatadirinfo)
{
//获取上一次更新的目录 ClickOnce每次更新会创建(或修改)两三个目录,这两三个目录的LastWriteTime很近(根据实现下载时间),我们这里定义为600秒之内
if (updatafilesinfo.LastWriteTime > mindatetime && Math.Abs(updatafilesinfo.LastWriteTime.Subtract(lastupadtedirinfo.LastWriteTime).TotalSeconds) > 600)
{
preupadtedirinfo = updatafilesinfo;
mindatetime = updatafilesinfo.LastWriteTime;
}
} if (preupadtedirinfo == null)
{
return;
} FileInfo[] prefileinfolist = preupadtedirinfo.GetFiles();
foreach (FileInfo prefileinfo in prefileinfolist)
{
foreach (string notupdatefilenames in NOTUPDATEFILENAMES)
{
if (prefileinfo.Name.ToLower() == notupdatefilenames.ToLower())
{
FileInfo[] lastnotupdatefileinfolist = lastupadtedirinfo.GetFiles(prefileinfo.Name, SearchOption.TopDirectoryOnly);
if (lastnotupdatefileinfolist != null && lastnotupdatefileinfolist.Length > 0)
{ FileInfo lastnotupdatefileinfo = lastnotupdatefileinfolist[0];
//如果最新的目录修改时间和配置文件修改时间非常接近(这里定义为60秒内),则说明配置文件是从服务上最新下载的,需要替换成上一个版本的
if (Math.Abs(lastnotupdatefileinfo.LastWriteTime.Subtract(lastupadtedirinfo.LastWriteTime).TotalSeconds) < 60)
{
try
{
prefileinfo.CopyTo(lastnotupdatefileinfo.FullName, true); }
catch (Exception ex)
{ //忽略复制时的错误
}
}
}
}
}
}
}