一意のファイル名またはパスを生成するにはどうすればよいですか?Unix(ライク)オペレーティングシステムとWindowsの両方で機能するソリューションを探しています。
6 に答える
使用boost::uuid
:
#include <string>
using std::string;
#include <boost/lexical_cast.hpp>
using boost::lexical_cast;
#include <boost/uuid/uuid.hpp>
using boost::uuids::uuid;
#include <boost/uuid/uuid_generators.hpp>
using boost::uuids::random_generator;
#include <boost/uuid/uuid_io.hpp>
string make_uuid()
{
return lexical_cast<string>((random_generator())());
}
生成された UUID をファイル名として使用します (したがって、パスは無関係です)。
他の場所で述べたように、ありますtmpnam
。多くの場合、他のプロセスとの競合状態を可能にするために、実装が不十分です。ただし、一般的なシングル ユーザー マシンでは、多くの場合、これで十分です。
私自身のコードでは、通常、名前の一部としてプロセス ID を使用してディレクトリを作成し、その中にすべての一時ファイルを配置します (単純なカウンターを使用してファイル名を変更します)。共有ディスクでは、プロセッサ ID をディレクトリ名にマングルします (ただし、一時ファイルをローカルの非共有ドライブに置く傾向があり、これによりほとんどの問題を回避できます)。
最も簡単な方法:乱数を生成し、その16進値をファイル名として使用します(ファイルが存在する場合を除きます。ファイルが存在する場合は、新しいファイルを作成します)。
最も簡単な方法2:存在しないファイルが必要な場合は、ファイル名またはその一部として番号(またはその16進値)を使用します。その名前のファイルが存在しなくなるまで番号を増やします。
より複雑な方法:GUIDを生成し、それをファイル名として使用します(ここでも、GUIDが使用されていないことを確認してください)。
現在のタイムスタンプを取得して、ファイル名として使用できます。または、最後のファイル名を1増やします。
例として、1.txt、2.txtなど。
Cライブラリ関数tmpfile
またはを使用しtmpnam
ます。どちらもWindowsとLinuxの下に存在します。
ただし、tmpfileを使用すると、プログラムを閉じると自動的に削除されるので、おそらくtmpnam
より適していることに注意してください。