2014-11-21 55 views
0

我正在使用第三方庫將文檔轉換爲PDF。輸出文件名將是任意的 - 由客戶端提供。如果具有該名稱的文件已經存在,我的代碼將以類似於MS Windows的方式修改文件名,例如, 「myname.txt」變成「myname(1).txt」。我想以某種方式保留輸出文件名,以便我的代碼不僅是線程安全的,而且還是「流程安全的」,這意味着在我的代碼確定了它想要的唯一文件名後,另一個應用程序的進程將不會創建該文件使用,但在它實際創建文件之前。如何以線程安全且處理安全的方式保留文件名

看起來,通常或簡單的方法是在編寫文件時使用異常處理和循環結構,以便在上次寫入嘗試失敗時創建唯一文件名,因爲具有該名稱的文件已存在。但是,由於寫入文件的第三方實現無疑具有我不希望在循環中多次產生的副作用,因此我想找到一種方法來保證文件名在第一次可用時調用第三方代碼來寫入文件。

有沒有辦法做到這一點?

+0

Dupe? http://stackoverflow.com/questions/581570/how-can-i-create-a-temp-file-with-a-specific-extension-with-net – 2014-11-21 16:08:55

+0

@MarcB - 不,因爲文件名可以是任何東西,而不是一個GUID。這由調用我的代碼的代碼提供。我只想使用提供的文件名進行文件寫入(如果可用),並且只調用一次第三方寫入。 – 2014-11-21 16:20:36

+0

爲什麼鏈接的問題不回答這個問題?它向您展示瞭如何使寫入成功,只需使用一個保證不會被採用的名稱。 – usr 2014-11-21 16:31:35

回答

1

將PDF寫入臨時文件,保證不會被採取(例如使用Guid.NewGuid())。然後,將該文件重命名爲所需的文件名。這個重命名是原子的。如果失敗,您可以決定要做什麼。 PDF組件只需要調用一次。重命名可以執行多次,可能使用不同的目標名稱。

+0

根據你和Marc的評論,我開始思考這些問題。 – 2014-11-21 16:47:42