2016-02-25 13 views

答えて

5

錆1.9.0からは、OpenOptions::create_newがあります。これにより、安全に、かつ原子的に新しいファイルを作成していることを確認でき、そうでない場合はコマンドが失敗します。

2

更新:マシュー・デイビッドがコメントに指摘しているように。 から 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_EXCLの両方をopen(3)関数に渡す必要があります。または、WindowsではCREATE_NEWCreateFile()関数のdwCreationDispositionパラメーターに渡します。


EDIT:私はもともと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

関連する問題