2016-02-25 22 views

回答

5

從Rust 1.9.0開始,有OpenOptions::create_new可以讓你安全地和自動地確保你正在創建一個新文件,否則你的命令將會失敗。

2

更新:正如Mathieu David在評論中指出的那樣。 exists() from std::path::Path可用於檢查路徑是否存在。

老答案:

在C,檢查是否文件名/路徑存在通常用做:

! access(filename, F_OK) 

access返回文件是否存在0,前提是你必須所需的權限。

我做了一個本地Rust等價物的快速搜索,找不到任何東西。所以,你可能需要依靠libc::access這個。

+6

是否有可能在這裏發生競爭條件,文件在「access」之後但在「open」之前出現? – Shepmaster

+0

@Shepmaster是的。我相信我看到了Coverity Scan對此的警告。但是,有什麼選擇? –

+0

爲什麼你需要使用不安全的功能?您可以使用['exists()'](https://doc.rust-lang.org/std/path/struct.Path.html#method.exists)檢查路徑是否存在,然後創建該文件「T。 –

4

它可能在C11中,或者直接使用底層的OS API函數。

如果您使用C11,則fopen允許您以"wx"模式打開文件。

否則,在Linux上,應該將O_CREATO_EXCL都傳遞給open(3)函數。或者,在Windows上,將CREATE_NEW傳遞給CreateFile()函數的參數dwCreationDisposition


編輯:我原來錯過了一個事實,即open功能已在C11進行了更新。

+0

實際上在C11中增加了獨家開放模式。 'fopen(「wx」)' – bluss

+0

@bluss:該死的,我最喜歡的參考(http://en.cppreference.com/w/cpp/io/c/fopen)沒有提到這個'x'標誌。 –

+1

他們沒錯,如果你檢查他們的*** C ***參考http://en.cppreference.com/w/c/io/fopen :-) – bluss

相關問題