我的問題是在What is the best way to test whether a file exists on Windows?這個問題上的一個小小的變化,有一些具體的注意事項。具體而言,數據位於映射驅動器上,並使用SMB 2.0協議。 (根據定義,這要求將驅動器從Vista機器映射到Vista或Server 2008機器。)在Windows Vista上測試網絡共享上文件存在的最佳方法是什麼?
回覆上述問題時發佈的解答的問題是SMB 2.0緩存了一堆元數據包括給定目錄中的文件名。因此,如果您正在測試是否存在創建了的文件,則只需創建,然後函數_access,access,GetFileAttributes和CreateFile(以及其他方法)都將使用緩存的信息來回答「存在此文件是否存在?」。如果該文件最近由另一個用戶創建,則緩存指示該文件不存在,儘管它確實存在。我已經設置了測試環境來測試這一點,並且我可以確認否 SMB2流量是由客戶端生成的幾秒鐘[假設緩存每5秒鐘過期]。
有沒有其他人看到過這個? (如果是這樣,你是否發現了一個解決方案,而不是添加延遲/重試?)有誰知道任何API類似於上述,可以檢查文件的存在而不使用SMB緩存?或者,更好的是,是否有人知道只會轉儲緩存的SMB元數據的Windows API?
爲什麼您需要完全做到這一點?爲什麼緩存給出「錯誤」答案會造成問題?什麼取決於它「工作」? – 2009-02-25 01:49:44
好吧,沒有太多細節,用戶啓動一個進程,在共享中創建一個新文件。如果該文件是由另一臺機器創建的,則「錯誤」答案意味着用戶無法打開文件,因爲如果文件「不存在」,SMB2將不會發送打開的請求。 – 2009-02-25 18:16:04
我想你應該進入更多的細節。我想這個設計還有其他方面可以改進以提供令人滿意的用戶體驗。 – 2009-02-26 04:19:03