「ファイル名を入れ替える」とはどういう意味ですか? ファイルシステムについて話しているのですか、それともプログラム内の変数について話しているのですか?
プログラムが C++ で、文字列に 2 つのファイル名があり、それらを交換したい場合は、std::swap を使用します。これは、プログラム内の変数のみを変更します。
std::string filenameA("somefilename");
std::string filenameB("othername");
std::swap(filenameA, filenameB);
std::cout << filenameA << std::endl; // prints "othername"
ディスク上に 2 つのファイルがあり、名前の内容を互いに交換したい場合、いいえ、ハード リンクを保持したい場合、簡単に交換する方法はありません。「安全な保存」を実行したいだけの場合、UNIX の rename() システム コールは、アトミック操作で宛先ファイルをソース ファイルと一緒に上書きします (基礎となるファイル システムでサポートできる限りアトミックに)。したがって、次のように安全に保存します。
std::string savename(filename);
savename += ".tmp";
... write data to savename ...
if (::rename(savename.c_str(), filename.c_str()) < 0) {
throw std::exception("oops!");
}
本当に本当にディスク上のファイルを交換する必要がある場合 (たとえば、バックアップ コピーを保持するため)、ハードリンクに入ります。注: ハードリンクはすべてのファイル システム (特に一部の SMB ファイル共有) でサポートされているわけではないため、必要に応じてバックアップを実装する必要があります。一時ファイル名は必要ですが、一時データ ストアは必要ありません。link() と unlink() を使用して手動で実装することもできますが (覚えておいてください: UNIX ではファイルに複数のハード リンクを含めることができます)、rename() を使用するだけの方が簡単です。ただし、スワップを完全にアトミックに行うことはできません。
oldfile が "filname.dat" で、newfile が "filename.dat.bak" であると仮定すると、次のようになります。
::link(oldfile, tempfile);
::rename(newfile, oldfile);
::rename(tempfile, newfile);
リンク後にクラッシュすると、新しいデータが newfile に、古いデータが oldfile と tempfile に保存されます。最初の名前変更後にクラッシュすると、新しいデータが oldfile に、古いデータが tempfile に保存されます (ただし、newfile には保存されません)。