比较文件修改时间失败

时间:2012-10-24 19:56:29

标签: c# .net compact-framework

我正在开发基于.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(),以便不会出现与时区相关的差异(并且,正如我所提到的,这适用于其他文件)。所以我总是得到这样的情况:

  • 远程站点提供了许多文件,其中有真正更改的文件(我的应用程序,我的DLL等)以及那些符号DLL(总是!)
  • 文件已下载并更新
  • 我的应用程序再次运行并再次检查更新
  • 现在只有符号DLL报告为已更改
  • 应用程序陷入无限循环,因为符号DLL总是具有不同的修改时间1小时

我尝试创建一个额外的应用程序来读取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替换文件,并再次运行主应用程序。然而,相同的文件(符号。*)被视为已更改并下载和替换。只有那些,在进一步的更新检查请求中不存在其他文件。决不。正是这些文件出了问题,而不是我的代码,还有其他文件。

1 个答案:

答案 0 :(得分:0)

在MD5哈希上添加辅助检查。比无限循环好。