std::filesystem::create_hard_link
| ヘッダ <filesystem> で定義
|
||
void create_hard_link( const std::filesystem::path& target, const std::filesystem::path& link ); void create_hard_link( const std::filesystem::path& target, const std::filesystem::path& link, std::error_code& ec ) noexcept; |
(C++17以上) | |
POSIX の link() によって行われたかのように、ターゲットが target に設定されたハードリンク link を作成します。 パス名 target は存在していなければなりません。
いったん作成されると、 link と target は同じファイルを参照する2つの論理名になります (equivalent になります)。 元の名前 target が削除されても、ファイルは存在し続け、 link としてアクセス可能です。
引数
| target | - | リンクするファイルまたはディレクトリのパス |
| link | - | 新しいハードリンクのパス |
| ec | - | 例外を投げないオーバーロードでエラーを報告するための出力引数 |
戻り値
(なし)
例外
std::error_code& 引数を取らないオーバーロードは、ベースとなる OS の API でエラーが発生した場合、第1パス引数に target、第2パス引数に link、エラーコード引数に OS のエラーコードを指定して構築された filesystem_error を投げます。 std::error_code& 引数を取るオーバーロードは、 OS の API 呼び出しが失敗した場合、その引数を OS の API のエラーコードに設定し、エラーが発生しない場合は ec.clear() を実行します。 noexcept 指定のないあらゆるオーバーロードは、メモリ確保に失敗した場合 std::bad_alloc を投げる可能性があります。
ノート
オペレーティングシステムによっては、ハードリンクがまったくサポートされなかったり、普通のファイルに対してだけしかサポートされなかったりします。
ファイルシステムによっては、オペレーティングシステムにかかわらず、ハードリンクがサポートされないことがあります。 例えば、メモリカードや USB メモリで使用される FAT ファイルシステムなどです。
ファイルシステムによっては、ファイルごとのリンク数に制限があることがあります。
ディレクトリに対するハードリンクの作成は、一般的にはスーパーユーザに限定されます。
ハードリンクは、一般的にはファイルシステム境界を越えることはできません。
特別なパス名ドット "." は、その親ディレクトリへのハードリンクです。 特別なパス名ドット-ドット ".." は、その親の親のディレクトリへのハードリンクです。
例
#include <iostream>
#include <fstream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::create_directories("sandbox/subdir");
std::ofstream("sandbox/a").put('a'); // create regular file
fs::create_hard_link("sandbox/a", "sandbox/b");
fs::remove("sandbox/a");
// read from the original file via surviving hard link
char c = std::ifstream("sandbox/b").get();
std::cout << c << '\n';
fs::remove_all("sandbox");
}
出力:
a
関連項目
(C++17)(C++17) |
シンボリックリンクを作成します (関数) |
(C++17) |
指定されたファイルを参照しているハードリンクの数を返します (関数) |