2016-02-25 41 views

cevap

5

Pas 1.9.0'dan itibaren, yeni bir dosya oluşturduğunuzdan emin olmanızı ve atomunuzu güvenli bir şekilde sağlamanızı sağlayan OpenOptions::create_new vardır ve komutunuz aksi halde başarısız olacaktır.

2

Güncelleme: Mathieu David yorumlarda dikkat çekti. Bir yolun olup olmadığını kontrol etmek için std::path::Path numaralı telefondan exists() kullanılabilir.

Eski Cevap:,

! access(filename, F_OK) 

access getiri 0 dosya varsa sahip olması koşuluyla:

C olarak, bir dosya adı/yol genellikle yapılır Varlığından Kontrolden eğer gerekli izinler.

Doğal bir Rust eşdeğeri için hızlı arama yaptım ve bulamadım. Bu nedenle, bunun için libc::access'a güvenmeniz gerekebilir.

+6

Bir yarış koşulu burada gerçekleşebilir, burada dosya 'access''ten sonra ama' open''den önce var olur mu? – Shepmaster

+0

@Shepmaster Evet. Ve bu konuda Coverity Scan uyarısı gördüğümü düşünüyorum. Ama alternatif nedir? –

+0

Neden güvenli olmayan bir işlev kullanmanız gerekiyor? Bir yolun ['var()'] ile (https://doc.rust-lang.org/std/path/struct.Path.html#method.exists) var olup olmadığını kontrol edebilir ve daha sonra dosyayı oluşturmazsa oluşturabilirsiniz. 't. –

4

C11'de veya doğrudan düşük düzey OS API işlevleri kullanılarak mümkündür.

C11'i kullanırsanız, fopen dosyayı "wx" modunda açmanıza izin verir. Aksi taktirde, Linux'ta,ve O_EXCL öğelerini open(3) işlevine iletmelidir. Veya, Windows'ta, CreateFile() işlevinin dwCreationDisposition parametresine CREATE_NEW parametresini iletin.


DÜZENLEME: Başlangıçta open işlevi C11 güncellenen vardı gerçeğini kaçırdım.

+0

Özel açık mod aslında C11'e eklenmiştir. 'fopen (" wx ")' – bluss

+0

@bluss: Lanetlenmiş, benim favori referansım (http://en.cppreference.com/w/cpp/io/c/fopen) bu x' işaretinden bahsetmiyor. –

+1

Eğer onların *** C *** referansını kontrol ediyorsanız doğrular. Http://en.cppreference.com/w/c/io/fopen :-) – bluss

İlgili konular