◐ Shell
clean mode source ↗

std::filesystem::create_symlink, std::filesystem::create_directory_symlink - cppreference.com

提供: cppreference.com

<tbody> </tbody>

ヘッダ <filesystem> で定義

void create_symlink( const std::filesystem::path& target, const std::filesystem::path& link ); void create_symlink( const std::filesystem::path& target, const std::filesystem::path& link, std::error_code& ec ) noexcept;

(1) (C++17以上)

void create_directory_symlink( const std::filesystem::path& target, const std::filesystem::path& link ); void create_directory_symlink( const std::filesystem::path& target, const std::filesystem::path& link, std::error_code& ec ) noexcept;

(2) (C++17以上)

POSIX の symlink() によって行われたかのように、ターゲットを target に設定したシンボリックリンクを作成します。 パス名 target は無効であったり存在しなかったりしても構いません。

オペレーティングシステムによっては、シンボリックリンクの作成時に、ディレクトリを指すかどうかを指定することが要求されます。 POSIX システムでは区別されませんが、移植性のあるコードでは、ディレクトリシンボリックリンクを作成するためには、 (1) ではなく (2) を使用するべきです。

引数

target - シンボリックリンクの指す先のパス。 存在する必要はありません
link - 新しいシンボリックリンクのパス

戻り値

(なし)

例外

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 システムなどです。

ハードリンク同様、シンボリックリンクはファイルが複数の論理名を持つことを可能にします。 ハードリンクは、元の名前が削除された後でも、ファイルの存在を保証します。 シンボリックリンクは、そのような保証を提供しません。 実際、リンクが作成されるときに target 引数の名前を持つファイルが存在している必要はありません。 シンボリックリンクはファイルシステム境界を越えることができます。

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main()
{
    fs::create_directories("sandbox/subdir");
    fs::create_symlink("target", "sandbox/sym1");
    fs::create_directory_symlink("subdir", "sandbox/sym2");

    for(auto it = fs::directory_iterator("sandbox"); it != fs::directory_iterator(); ++it)
        if(is_symlink(it->symlink_status()))
            std::cout << *it << "->" << read_symlink(*it) << '\n';

    fs::remove_all("sandbox");
}

出力例:

"sandbox/sym1"->"target"
"sandbox/sym2"->"subdir"

関連項目