2009-02-13 18 views
3

我的問題是在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?

+0

爲什麼您需要完全做到這一點?爲什麼緩存給出「錯誤」答案會造成問題?什麼取決於它「工作」? – 2009-02-25 01:49:44

+0

好吧,沒有太多細節,用戶啓動一個進程,在共享中創建一個新文件。如果該文件是由另一臺機器創建的,則「錯誤」答案意味着用戶無法打開文件,因爲如果文件「不存在」,SMB2將不會發送打開的請求。 – 2009-02-25 18:16:04

+0

我想你應該進入更多的細節。我想這個設計還有其他方面可以改進以提供令人滿意的用戶體驗。 – 2009-02-26 04:19:03

回答

1

雖然不是一個編程解決方案,但我發現了一種有效的解決方法(藉助於Microsoft支持)。我想在這裏發佈解決方法,以防其他人像我一樣對此感到沮喪。由於這種行爲是SMB2的「功能」,微軟提供了以下注冊表項來替代默認的元數據緩存生存:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters\FileInfoCacheLifetime 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters\FileNotFoundCacheLifetime 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters\DirectoryCacheLifetime 

每這些都是DWORD值,可以根據您的需要進行設置。 (在SMB2客戶端上將它們設置爲0對於解決我的問題非常有效。)

-1

只要打開它。

0

致電open(path, O_CREAT | O_EXCL, mode)並檢查結果。如果該文件已存在,則會導致錯誤。這肯定會寫入SMB緩存並給出正確的結果,否則將會非常不可靠。因此,如果調用成功,那麼文件文件沒有存在,但現在它已經存在,因此您可能需要刪除它(取決於應用邏輯)。如果呼叫失敗,文件已存在

相關問題