web-dev-qa-db-ja.com

C ++:一時ファイルの取得、クロスプラットフォーム

一時ファイルを指定するためのクロスプラットフォームの方法を探しています。たとえば、Linuxでは_/tmp_ディレクトリにあり、WindowsではInternet Explorerの一時ディレクトリと呼ばれるくだらない名前です。

これに対するクロスプラットフォーム(Boost?)ソリューションはありますか?

[〜#〜]編集[〜#〜]

プログラムが終了するまで、このファイルが存在する必要があります。 tmpfile()はそれを保証しません。 ccpreferenceからの引用:

作成された一時ファイルは自動的に削除されますストリームが閉じられたとき(fclose)またはプログラムが正常に終了したとき。

41
orlp

Boost Filesystemライブラリのバージョン3のライブラリを使用して、一時ファイル名を作成できます。また、鮮明なソリューションを提供します。実際、次のC++コードはプラットフォームに依存しません。

// Boost.Filesystem VERSION 3 required
#include <string>
#include <boost/filesystem.hpp>
boost::filesystem::path temp = boost::filesystem::unique_path();
const std::string tempstr    = temp.native();  // optional

ファイルシステムパスオブジェクトtempは、ファイルを開いたりサブディレクトリを作成したりするのに使用できますが、文字列オブジェクトtempstrは文字列と同じ情報を提供します。詳細は http://www.boost.org を参照してください。

82
Robbie Morrison

Qtを使用する場合: QTemporaryFile クラスは完璧です。

7
Naszta

標準Cライブラリにはtmpfileと呼ばれる関数が含まれています。おそらく、必要な機能を実行します。 http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/

C++プログラムでも使用できます。

編集:
ファイル名だけが必要な場合は、 tmpnam を使用できます。fcloseが呼び出されても、ファイルは削除されません。一時ディレクトリを含む完全なファイルパスを返します。

Cの方法:

const char *name = tmpnam(NULL);  // Get temp name
FILE *fp = fopen(name, "w");  // Create the file
// ...
fclose(fp);
remove(name);
5
Karel Petranek

C標準ライブラリ関数tmpfileを使用できます。

4
James McNellis

編集:本質的にはBoostのアイデアが好きなようなので、 Robbie Morrisonの答え がおそらくあなたにとってより良いでしょう。

私の元の答えは以下にありますが、これを読んでいる人は誰でも:tmpnamは安全でないことに注意してください。さらに、一部のプラットフォーム(Windowsなど)は、壊れている、バグが多い、頭が悪い、または実装が欠けている場合さえあります。


Tmpfileが気に入らない場合は tmpnam はどうですか?

リンクから:

この方法で作成されたファイルは、tmpfileで作成されたファイルとは異なり、閉じても自動的に削除されません。閉じたらこのファイルを削除するには、removeを呼び出す必要があります。

特に、ファイルの名前を知るために別のプログラムが必要な場合は、tmpfileでは名前がまったく与えられないため、これがより適切と思われます。

それが心配なら、私はそれはそれほど安全ではないと思います。これが これらの問題のいくつかを説明するリンク です。


余談:tmpfileを使用したい場合でも、より安全な tmpfile_sMS docs を検討する必要があります。 C++標準からすぐに削除されます)。いずれにしても、これらのどちらも、必要な名前付きファイルを保持しません。

2
jwd

プログラム間の通信には、ランダムな一時ファイルよりもはるかに優れた方法があります。代わりにパイプを通信に使用できますか? localhostソケットの使用についてはどうですか?

ファイルの使用を主張する場合は、起動時間に基づいた名前をプログラムに使用させるだけです。

0
Mark B

C++ 17以降、 std :: filesystem :: temp_directory_path() を使用できます。

0
havogt