Es sieht so aus, als ob OpenOptions
dieses Szenario nicht unterstützt und eine vorhandene Datei entweder abgeschnitten oder überschrieben wird.Gibt es eine Möglichkeit, eine Datei zu erstellen und zu öffnen, wenn sie nicht existiert, aber sonst fehlschlägt?
Antwort
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.
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 Berechtigungenhabe ich eine schnelle Suche nach einer nativen Äquivalent Rust und konnte nichts finden. Möglicherweise müssen Sie sich deshalb auf
libc::access
verlassen.
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.
Exklusiver offener Modus wurde tatsächlich in C11 hinzugefügt. 'Fopen ("wx")' – bluss
@bluss: Damned, mein Liebling Referenz (http://en.cppreference.com/w/cpp/io/c/fopen) nicht erwähnt diese 'x' Flagge. –
Sie haben es richtig, wenn Sie ihre *** C *** Referenz http://en.cppreference.com/w/c/io/fopen überprüfen :-) – bluss
- 1. Erstellen Sie eine TXT-Datei, wenn es nicht existiert, und wenn es eine neue Zeile anfügt
- 2. Gibt es eine Möglichkeit, den Grund herauszufinden, wenn ftp_put fehlschlägt?
- 3. Gibt es eine Möglichkeit, eine leere .mo-Dateivorlage zu erstellen?
- 4. Clean Java 7 Möglichkeit, Datei zu erstellen, wenn nicht existiert
- 5. Gibt es eine Möglichkeit, Datei mit Emacsclient (Benutzer) zu öffnen, aber mit Root-Berechtigung?
- 6. Gibt es eine Möglichkeit, eine anklickbare Verknüpfung in Excel zu erstellen, um eine Datei im selben Ordner zu öffnen?
- 7. Gibt es eine schmerzfreie Möglichkeit, eine "css sandbox" zu erstellen?
- 8. Gibt es eine Möglichkeit, eine benutzerdefinierte Toastbenachrichtigung zu erstellen?
- 9. VB.NET: XMLWriter() prüfen, ob ein Verzeichnis existiert und ob eine Datei existiert, sonst erstellen Sie sie
- 10. Gibt es eine Möglichkeit, eine Gleitkommazahl ohne ldexp zu erstellen?
- 11. Gibt es eine Möglichkeit zu wissen, ob Benutzer Mail öffnen?
- 12. Gibt es eine Möglichkeit, zu teilweise hochgeladenen Dateien zu gelangen?
- 13. Gibt es eine Möglichkeit, Formularantwort zu ignorieren?
- 14. Gibt es eine Möglichkeit, ConfigurationManager.AppSettings zu überschreiben?
- 15. Gibt es eine Möglichkeit, eine Klasseneigenschaft in Python zu erstellen?
- 16. Gibt es eine Möglichkeit, Creeps zu löschen?
- 17. Gibt es eine Möglichkeit, eine Datei in Subversion zu "kleben"?
- 18. Gibt es eine Möglichkeit, eine MDB-Datei selbst zu leeren
- 19. Effiziente Möglichkeit, entweder eine Liste zu erstellen oder an sie anzuhängen, wenn eine bereits existiert?
- 20. Gibt es eine Möglichkeit, eine Textdatei zu schreiben und sie durch die vorherige ersetzen zu lassen?
- 21. Gibt es eine Möglichkeit, den JFace ElementTreeSelectionDialog ungefaltet zu öffnen?
- 22. Gibt es eine Möglichkeit, mv das Verzeichnis zu erstellen, in das verschoben werden soll, wenn es nicht existiert?
- 23. Gibt es eine Möglichkeit, TypeScript-Klassen in Closures zu erstellen?
- 24. Gibt es eine Möglichkeit, rohe Geojson-Daten zu erhalten und zu glätten und eine neue geglättete Datei zu erstellen?
- 25. Gibt es eine Möglichkeit, eine Datei mit Abhängigkeiten in Java automatisch zu erstellen und sie automatisch zu installieren?
- 26. (Batch) Gibt es eine Möglichkeit, anklickbare Schaltflächen zu erstellen?
- 27. PHP erstellen Sie eine Datei, wenn nicht existiert
- 28. Gibt es eine Möglichkeit, eine Express-App zu booten?
- 29. Gibt es eine Möglichkeit, benutzerdefinierte Eigenschaften in Kivy zu erstellen?
- 30. Gibt es eine Möglichkeit, einen Sicherungspunkt ohne Transaktion zu erstellen?
Ist es möglich, dass eine Race-Bedingung hier geschehen, in dem die Datei nach dem 'access' zustande kommt aber vor' open'? – Shepmaster
@Shempmaster Ja. Und ich glaube, dass Coverity Scan davor gewarnt hat. Aber was ist die Alternative? –
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. –