2012-10-24 88 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哈希值的輔助檢查。比無限循環更好。