.net2.0写的winapp程序,如果用VS自带的ClickOnce发布功能,每次更新时,客户端会自动下载所有的文件。
而我想要的是只下载有更新的文件。MSDN里提到了一种“文件修补”技术(http://msdn.microsoft.com/zh-cn/asp.net/ms404267.aspx)
可以完成这个任务,但没有说具体做法。有哪位大侠研究过,还请指教。

解决方案 »

  1.   

    刚才在CSDN上搜了一个这个问题的帖子,和我一样遇到这个问题的人还不少,但是都没有得到答案,郁闷。
    既然MSDN里明确提出了可以做到,我想大家还是一起研究研究吧,很有价值。
      

  2.   

    自己写了一个静态函数来解决旧文件被覆盖的问题,原理是从上一个版本的文件夹中取出不想覆盖的文件,Copy到更新后的文件夹,代码如下
            //防止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)
                                    {                                    //忽略复制时的错误
                                    }
                                }
                            }
                        }
                    }
                }
            }