我正在开发基于.NET的客户端 - 服务器应用程序。服务器端在Windows XP上运行,客户端在Windows CE设备上运行(Motorola Symbol 3100,这可能是相关的)。
客户端需要自动更新功能,我决定自行实施,因为有几个主题阻止我使用任何现成的自动更新解决方案。我的应用程序每次启动时都会检查更新,并通过LastModificationTime比较远程站点上的文件。如果有,它会将文件从远程服务器下载到临时目录,然后停止并运行另一个替换更新文件并运行主应用程序的应用程序。
正在通过套接字下载文件,因此在下载文件后,我的应用程序会将每个文件上的LastModificationTime设置为远程站点提供的值。我正在使用来自this topic的时间更改解决方案,并且它运行良好,即文件修改时间更新得很好,尽管这些文件中的某些文件的比较失败了。可能相关的是,我的解决方案无法比较的那些文件是Motorola Symbol DLL。
问题在于,尽管我完成了所有工作,但每次比较时,这些符号文件都有不同的修改时间戳。它始终相差1小时。例如。远程站点说文件时间是2012年1月24日5:13:08,而在我的应用程序端则是2012年1月24日6:13:08。任何其他文件都没有问题。那些"任何"是我的应用程序exe,我的DLL,由第三方组件(如OpenNETCF),MS .NET相关文件等提供的DLL。他们都没有麻烦我 - 如果他们更新,这只是一次,如果他们没有真正改变,那么没有更新。在比较期间,我总是使用ToUniversalTime(),以便不会出现与时区相关的差异(并且,正如我所提到的,这适用于其他文件)。所以我总是得到这样的情况:
我尝试创建一个额外的应用程序来读取Symbol文件上的文件时间戳,然后再次设置它。我认为原始的Symbol文件可能有一些错误的"日期时间等等。即使我将新时间设置增加1秒,这也没有任何改进:在更新代码中进行比较时,它又是1小时差异。
最后,我决定从我的更新中删除那些Symbol文件。它们没有经常更换,所以我有时间发现这个问题,但如果摩托罗拉推出下一次更新 - 我将再次陷入我的问题。
我不知道问题来源的位置,我会对此提出任何建议表示感谢。我认为我的来源是无关紧要的,因为这个问题仅针对某些文件发生,并且无论如何修改时间总是正确地改变:我在我的设备上,在服务器部署文件夹(从哪里下载更新)中查看它,到处都是。可能这是与时区相关的问题,但它如何只影响一些文件,而不是每个文件?
我会进一步解释。我的服务器在其更新文件夹中包含以下文件:
FliteDevice.dll
fliteDLL.dll
OpenNETCF.dll
OpenNETCF.AppSettings.dll
OpenNETCF.Configuration.dll
pdt.exe
PdtComm.dll
Symbol.dll
Symbol.xml
Symbol.Audio.dll
Symbol.Audio.xml
Symbol.Barcode2.dll
Symbol.Barcode2.xml
Symbol.StandardForms.dll
Symbol.StandardForms.xml
System.Data.OracleClient.dll
System.EnterpriseServices.dll
System.EnterpriseServices.Wrapper.dll
System.Transactions.dll
System.Web.dll中
Update.exe的
考虑到我第一次运行更新,我的服务器会将所有这些文件发送给客户端。我的客户端(pdt.exe)全部接收它们,运行update.exe(并且存在,因此更新程序可以用新的替换app文件)替换已更改的文件(在这个首次运行的情况下所有文件)。
然后updater运行我的应用程序(pdt.exe),我的应用程序再次检查其文件与服务器端的文件。现在要更新的文件是:
Symbol.dll
Symbol.xml
Symbol.Audio.dll
Symbol.Audio.xml
Symbol.Barcode2.dll
Symbol.Barcode2.xml
Symbol.StandardForms.dll
Symbol.StandardForms.xml
再次updater替换文件,并再次运行主应用程序。然而,相同的文件(符号。*)被视为已更改并下载和替换。只有那些,在进一步的更新检查请求中不存在其他文件。决不。正是这些文件出了问题,而不是我的代码,还有其他文件。
答案 0 :(得分:0)
在MD5哈希上添加辅助检查。比无限循环好。