2016-02-25 6 views

Antwort

5

Ab Rust 1.9.0 gibt es OpenOptions::create_new, mit dem Sie sicher und atomar sicherstellen können, dass Sie eine neue Datei erstellen und Ihr Befehl andernfalls fehlschlägt.

2

Update: Als Mathieu David zeigte in den Kommentaren aus. exists() von std::path::Path kann verwendet werden, um zu prüfen, ob ein Pfad existiert.

Alte Antwort:

In C, zu überprüfen, ob ein Dateiname/Pfad existiert in der Regel mit getan:

! access(filename, F_OK) 

access 0 zurück, wenn die Datei vorhanden ist, vorausgesetzt, Sie haben die benötigten Berechtigungen

habe ich eine schnelle Suche nach einer nativen Äquivalent Rust und konnte nichts finden. Möglicherweise müssen Sie sich deshalb auf libc::access verlassen.

+6

Ist es möglich, dass eine Race-Bedingung hier geschehen, in dem die Datei nach dem 'access' zustande kommt aber vor' open'? – Shepmaster

+0

@Shempmaster Ja. Und ich glaube, dass Coverity Scan davor gewarnt hat. Aber was ist die Alternative? –

+0

Warum sollten Sie eine unsichere Funktion verwenden? Sie können prüfen, ob ein Pfad mit ['exists()'] existiert (https://doc.rust-lang.org/std/path/struct.Path.html#method.exists) und dann die Datei erstellen, falls dies nicht der Fall ist t. –

4

Es ist möglich, in C11, oder durch die direkte Low-Level-Betriebssystem-API-Funktionen verwenden.

Wenn Sie C11 verwenden, können Sie mit fopen die Datei im Modus "wx" öffnen.

Ansonsten sollte unter Linux sowohl O_CREAT als auch O_EXCL an die open(3) Funktion übergeben werden. Oder übergeben Sie unter Windows CREATE_NEW an den dwCreationDisposition-Parameter der CreateFile()-Funktion.


EDIT: Ich vermisste ursprünglich die Tatsache, dass die open Funktion in C11 aktualisiert worden war.

+0

Exklusiver offener Modus wurde tatsächlich in C11 hinzugefügt. 'Fopen ("wx")' – bluss

+0

@bluss: Damned, mein Liebling Referenz (http://en.cppreference.com/w/cpp/io/c/fopen) nicht erwähnt diese 'x' Flagge. –

+1

Sie haben es richtig, wenn Sie ihre *** C *** Referenz http://en.cppreference.com/w/c/io/fopen überprüfen :-) – bluss

Verwandte Themen