2010-07-01 601 views
3

我正在使用boost :: filesystem重命名一個文件,有時目標文件將存在。根據Boost文檔瀏覽:boost :: filesystem :: rename:當文件已經存在時無法創建文件

http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/reference.html#Non-member-functions

模板 無效的重命名(常量路徑1 & from_p,常量 路徑2 & to_p);要求: Path1 :: external_string_type和 Path2 :: external_string_type是 相同的類型。

影響:將from_p重命名爲to_p,就像POSIX rename()中的 一樣。

後置條件:存在(from_p)& & 存在(to_p),以及內容和文件的屬性 最初 命名from_p在其他方面不變。

[注意:如果from_p和to_p解析爲 相同的文件,則不採取任何操作。 否則,如果to_p解析爲 現有文件,則將其刪除。 A 符號鏈接本身已重命名爲 ,而不是其解析爲 的文件被重命名。 - 注完]

(我的重點)

當測試這個代碼通過MS Visual Studio 2008中的XP SP3編譯,重命名拋出的boost ::與消息文件系統:: filesystem_error:

當該文件已存在

無法創建一個文件,我注意到這已經提出bug報告: https://svn.boost.org/trac/boost/ticket/2866

...但是C針對索賠在Boost 1.41.0被關閉,我使用升壓1.42.0。

我在這裏做錯了什麼,或者我應該只是恢復爲std :: rename?

我沒有測試過這在Linux上又是那麼不知道是不是這個問題有太多的存在。

回答

3

看起來好像是固定的,但只有在沙箱「V3」 Boost.Filesystem的版本,這是不是在主線加速釋放呢。

我升壓1.43.0測試在Linux上使用相同的結果 - 事實上bug報告指出有問題的代碼,明確檢查是否存在對POSIX和拋出異常。這可能是因爲Windows上的MoveFile表現出相同的行爲?在沙盒V3版本中,重命名將在Windows上調用MoveFileEx,在POSIX上調用std::rename,並允許覆蓋現有文件。

我想你可以通過在調用boost::filesystem::rename之前調用目標boost::filesystem::remove來解決它,這取決於你的程序是否需要操作爲原子操作。

+1

謝謝,我還沒有意識到修復並未向更廣泛的世界發出。 對於我正在開發的應用程序,我可能會使用刪除/重命名,但正如你所說,如果我需要一些原子,我會被塞滿。 – 2010-07-01 13:34:40

相關問題