2017-09-06 108 views
2

在C++ 17文件系統庫中,我們得到了std::filesystem::remove(path),據我瞭解,它是來自Boost.Filesystem的boost::filesystem::remove(path)的直接端口。std :: remove和boost :: filesystem :: remove之間的區別?

但C++從C89繼承了一個非常類似的函數,稱爲std::remove(path),它是也是記錄爲從文件系統中刪除文件的一種方式。我隱約意識到這個功能的一些缺陷,例如我相信我聽說在Windows上,std::remove不能用於刪除當前進程仍然保持打開的文件。

請問std::filesystem::remove是否用std::remove解決了這些問題?我應該更喜歡std::filesystem::remove而不是std::remove?或者前者只是後者的命名空間的同義詞,具有相同的瑕疵和陷阱?

我的問題的題目詢問boost::filesystem::remove(path)std::remove(path)之間的差異,因爲我明白這std::filesystem::remove(path)可能沒有被許多庫廠商的實現還,但我的理解是,它應該是的基本上都是直接拷貝提升版本。所以如果你知道Windows上的Boost.Filesystem,你可能也知道足以回答這個問題。

+1

需要花一分鐘時間檢查'boost :: filesystem :: remove'的來源以知道它[簡單地調用'DeleteFileW'](https://github.com/boostorg/filesystem/blob/07619fb37007f45b54bc71877e724c8f4b014c9f/src /operations.cpp#L240)。 –

+1

當您運用一些注意事項時,'filesystem'函數可以處理一般的Unicode路徑。特別是,在當前的實現中,不要依賴UTF-8的默認轉換,但明確地做到這一點。舊的'std :: remove'僅限於狹窄的執行字符集,我真誠懷疑任何Windows實現檢測到該執行字符集是UTF-8(因爲即使'filesystem'實現未能檢測到)。所以在Windows中,它只能處理來自Windows ANSI字符的路徑,這是系統特定的編碼。 –

+0

@ Cheersandhth.-Alf:Windows C++實現如何檢測「執行字符集」是否爲UTF-8?這個實現定義了它自己的執行集(不需要檢測),或者它遵循Windows(它不允許UTF-8作爲默認字符集)。 – MSalters

回答

2

檢查我的MSVC,std::experimental::filesystem::remove調用其內部_Unlink幫手,它只是簡單地調用_wremove,這只是調用的Windows安裝DeleteFileW標準庫源。同樣,boost::filesystem::remove也只是在Windows上調用DeleteFileW


std::filesystem::removeis specified by reference to POSIX remove,但在[fs.conform.9945]全球措辭明確指出,實現並不需要提供準確的POSIX行爲:

實現應該提供,因爲它是由 POSIX定義這種行爲。實現應記錄任何與POSIX定義的行爲不同的行爲。不支持 精確POSIX行爲的實現應該提供與POSIX 行爲接近的行爲,因爲實際操作系統和文件系統的限制是合理的。如果實現不能提供任何合理的行爲,則實現應報告[fs.err.report]中指定的錯誤。 [注意:[...]]

實現不需要提供特定文件系統不支持的行爲。 [實施例:[...]]

::remove任何怪異(即有關刪除而不是文件的識別的實際行爲被刪除)很可能是由於底層的OS API的限制。我認爲沒有理由認爲在同一個操作系統上執行std::filesystem::remove會神奇地變得更好。

+0

Re「我認爲沒有理由認爲在同一個操作系統上執行std :: filesystem :: remove會奇蹟般地做的更好。」,好吧,正如我已經提到的在評論這個問題時,'std :: filesystem :: remove'可以處理一般的Unicode路徑。這在功能上有很大的不同。這意味着'std :: filesystem :: remove'會更好,更好。 –

+0

@ Cheersandhth.-Alf:檢查我的理解 - 你的區別在於'std :: remove'採用'const char *',但'fs :: remove'採用'fs :: path',它是[在Windows上基本上是'basic_string '](http://en.cppreference.com/w/cpp/filesystem/path)? – Quuxplusone

+0

@Quuxplusone:是的。 –

相關問題