2012-10-24 35 views
0

我正在开发基于.NET的客户端 - 服务器应用程序。服务器端在Windows XP上运行,客户端在Windows CE设备上运行(Motorola Symbol 3100,这可能是相关的)。比较文件修改时间失败

客户端需要自动更新功能,我决定自行实施,因为有几个主题阻止了我使用任何随时可用的自动更新解决方案。我的应用程序每次启动时都会检查更新,并通过LastModificationTime比较远程站点上的文件。如果有的话,它将文件从远程服务器下载到临时目录,然后停止并运行另一个应用程序来替换更新的文件并运行主应用程序。

文件正在通过套接字下载,因此在文件下载完成后,我的应用程序会将每个文件的LastModificationTime设置为远程站点提供的值。我使用this topic的时间更改解决方案,它运行良好,即文件修改时间已完美更新,但其中一些文件的比较失败。这可能是相关的,那些我的解决方案无法比较的文件是摩托罗拉Symbol DLL。

问题是,尽管我所有的工作,那些符号文件每次比较它们时都有不同的修改时间戳。它总是相差1小时。例如。远程站点说文件时间是2012年1月24日5:13:08,而在我的应用程序端是2012年1月24日6:13:08。任何其他文件都没有问题。这些“任何”是我的应用程序exe,我的DLL,由第三方组件(如OpenNETCF)提供的DLL,MS .NET相关文件等。他们都没有麻烦 - 如果他们更新,这只是一次,如果他们没有真正改变,那么没有更新。在比较期间,我总是使用ToUniversalTime(),以便不会出现与时区有关的差异(并且,正如我所提及的,这适用于其他文件)。所以,我总是像这样的情况:

  • 远程站点提供了大量的文件,并有内它确实修改过的文件(我的申请,我的DLL文件等),这些符号的DLL沿
  • (永远!)
  • 文件被下载并更新
  • 我的应用程序再次运行,并检查是否有更新再次
  • 现在只有符号DLL被报告为改变
  • 应用陷入死循环,作为符号的DLL总是有修改的时间由1不同小时

我试图创建一个额外的应用程序,它读取符号文件上的文件时间戳,然后再次设置它。我认为原始的Symbol文件可能会有一些“错误”的日期时间或其他东西。这并没有带来任何改善,即使我把新的时间增加了1秒:在更新代码中比较它再次是1小时的差异。

最后,我决定从我的更新中删除这些符号文件。它们不会经常更改,所以我有一些时间来发现这个问题,但是如果摩托罗拉将推出下一次更新 - 我将再次陷入我的问题。

我不知道问题来源的位置,我会很感激任何提示。我认为我的源代码无关紧要,因为这个问题只发生在某些文件上,无论如何修改时间总是正确地更改:我在我的设备,服务器部署文件夹(从下载更新的地方)检查了它,无处不在。可能这是与时区相关的问题,但它如何影响只有一些文件,而不是每个人?

我会进一步解释。我在更新文件夹服务器恰好包含以下文件:

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

符号.Barcode2.xml

Symbol.Standa rdForms.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(并且存在以便更新程序可以替换更新的应用程序文件),它替换更改的文件(所有文件在此首次运行的情况下)。

然后更新程序运行我的应用程序(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替换文件,并再次运行主应用程序。再次,相同的文件(那些Symbol。*)被视为已更改并下载并替换。只有这些,在更新更新检查请求中不存在其他文件。决不。这些文件,不是我的代码和其他文件都有问题。

+0

有人正在使用当地时间,而没有正确处理夏令时。可能是远程系统。 –

+0

可能在MD5哈希上添加辅助检查。比无止境的循环更好。 – Paparazzi

+0

@Hans Passant - 这可能是一个选项,如果它与其他文件发生。它仍然只涉及其中的一些。为什么不是别人? – Camper

回答

0

添加对MD5哈希值的辅助检查。比无限循环更好。