2017-04-10 4 views
13

std::filesystem auf C++ 17, und std::experimental::filesystem für viele Pre-C++ 17 Compiler, basieren auf boost::filesystem und fast alles ist offensichtlich, um die neuere Std zu portieren.Was ist das C++ 17-Äquivalent zu boost :: filesystem :: unique_path()?

Aber ich sehe keine std::filesystem entspricht boost::filesystem::unique_path().

Gibt es eine Entsprechung in Std, die ich nicht bemerke? Oder gibt es einen empfohlenen Ansatz, um die Implementierung nachzuahmen?

Ich hoffe wirklich die boost::filesystem Abhängigkeit zu ersetzen, wenn mein Code eine Plattform es Kompilieren auf merkt, dass std::filesystem unterstützt und unique_path() ist die einzige nicht offensichtlich Teil meiner Bekehrung.

Antwort

1

Soweit ich das beurteilen kann gibt es in C++ 17 wirklich keine exakte Entsprechung.

Sie nicht angeben, wirklich, was genau Sie tun möchten, aber wenn Sie nur eine temporäre Datei irgendwo speichern müssen, dann sollten Sie in der Lage sein, eine ähnliche Funktionalität mit std::filesystem::temp_directory_path zu imitieren, die Sie mit einem zufällig generierten Dateinamen anhängen (die Sie like this tun können, oder ändern Sie es entsprechend, wenn Sie genau die gleiche Namensformat als boost::filesystem::unique_path() erfordern)

oder wenn Sie nur jede temporäre Datei speichern müssen, können Sie std::tmpfile verwenden.

16

unique_path wurde entfernt, weil es sich um einen potenziellen Angriffsvektor für Malware handelte. Zwischen dem Aufruf von unique_path und dem Öffnen einer Datei an diesem Speicherort, während der ein anderer Prozess die gleiche Datei erstellen könnte, gibt es ein Fenster mit Möglichkeiten. Je nachdem, was der Benutzer mit der Datei macht, kann dies eine Sicherheitslücke darstellen oder nicht. Ein ähnliches Problem besteht bei der POSIX-Funktion tmpnam. Wie in this discussion erwähnt, wird dieses Problem in der nächsten Iteration der Bibliothek Filesystem behandelt. Bis dahin können Sie entweder Boost.Filesystem weiter verwenden, die in <cstdio> enthaltene Funktion std::tmpnam verwenden oder sicherere plattformspezifische Alternativen wie mkstemp verwenden.

Verwandte Themen