次の方法で共有


CreateHardLinkA 関数 (winbase.h)

既存のファイルと新しいファイルの間にハード リンクを確立します。 この関数は NTFS ファイル システムでのみサポートされ、ディレクトリではなくファイルに対してのみサポートされます。

この操作をトランザクション操作として実行するには、CreateHardLinkTransacted 関数を使用します。

構文

BOOL CreateHardLinkA(
  [in] LPCSTR                lpFileName,
  [in] LPCSTR                lpExistingFileName,
       LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

パラメーター

[in] lpFileName

新しいファイルの名前。

このパラメーターにはパスを含めることができますが、ディレクトリの名前を指定することはできません。

既定では、名前はMAX_PATH文字に制限されています。 この制限を 32,767 文字のワイド文字に拡張するには、パスの先頭に "\\?\" を付けます。 詳細については、「ファイル、パス、および名前空間の名前付けする」を参照してください。

先端

Windows 10 バージョン 1607 以降では、事前に "\\?\" なしでMAX_PATHの制限を削除することをオプトインできます。 詳細については、「名前付けファイル、パス、および名前空間の」の「パスの最大長制限」セクションを参照してください。

[in] lpExistingFileName

既存のファイルの名前。

このパラメーターには、ディレクトリの名前を指定できないパスを含めることができます。

既定では、名前はMAX_PATH文字に制限されています。 この制限を 32,767 文字のワイド文字に拡張するには、パスの先頭に "\\?\" を付けます。 詳細については、「ファイル、パス、および名前空間の名前付けする」を参照してください。

先端

Windows 10 バージョン 1607 以降では、事前に "\\?\" なしでMAX_PATHの制限を削除することをオプトインできます。 詳細については、「名前付けファイル、パス、および名前空間の」の「パスの最大長制限」セクションを参照してください。

lpSecurityAttributes

引っ込み思案;は NULLする必要があります。

戻り値

関数が成功した場合、戻り値は 0 以外です。

関数が失敗した場合、戻り値はゼロ (0) になります。 拡張エラー情報を取得するには、GetLastError呼び出します。

この関数で作成できるハード リンクの最大数は、ファイルあたり 1023 です。 ファイルに対して 1023 を超えるリンクが作成されると、エラーが発生します。

この関数の ANSI バージョンの lpFileName または lpExistingFileName パラメーターにMAX_PATH文字より長い名前を渡す場合、またはパスに "\\?\" を指定せずにこの関数の Unicode バージョンに渡すと、関数はERROR_PATH_NOT_FOUNDを返します。

備考

CreateFile または CreateHardLink を使用して作成されたファイルのディレクトリ エントリは、関連付けられているファイルへのハード リンクです。 CreateHardLink 関数を使用して作成される追加のハード リンクを使用すると、ファイルに対して複数のディレクトリ エントリを作成できます。つまり、同じファイルへの複数のハード リンク (同じディレクトリ内の異なる名前でも、異なるディレクトリ内の同じ名前でも異なる名前でもかまいません)。 ただし、ファイルへのハード リンクはすべて同じボリューム上にある必要があります。

ハード リンクはファイルのディレクトリ エントリのみであるため、そのファイルに対する多くの変更は、そのファイルを参照するハード リンクを介してアクセスするアプリケーションにすぐに表示されます。 ただし、ディレクトリ エントリのサイズと属性の情報は、変更が行われたリンクに対してのみ更新されます。

セキュリティ記述子は、ハード リンクが指すファイルに属しています。 リンク自体はディレクトリ エントリのみで、セキュリティ記述子はありません。 したがって、ハード リンクのセキュリティ記述子を変更すると、基になるファイルのセキュリティ記述子が変更され、ファイルを指すすべてのハード リンクで新しく指定されたアクセスが許可されます。 ハード リンクごとにファイルに異なるセキュリティ記述子を指定することはできません。

この関数は、lpSecurityAttributes パラメーターにセキュリティ記述子情報が渡された場合でも、リンク先のファイルのセキュリティ記述子を変更しません。

DeleteFile を使用して、ハード リンクを削除します。 作成された順序に関係なく、任意の順序で削除できます。

CreateFile で指定されているフラグ、属性、アクセス、および共有は、ファイルごとに動作 。 つまり、共有を許可しないファイルを開くと、別のアプリケーションがファイルへの新しいハード リンクを作成してファイルを共有することはできません。

NTFS ファイル システムでハード リンクを作成すると、ディレクトリ エントリ内のファイル属性情報が更新されるのは、ファイルが開かれている場合、または GetFileInformationByHandle が特定のファイルのハンドルで呼び出されたときだけです。

シンボリック リンクの動作 : パスがシンボリック リンクを指している場合、関数はシンボリック リンクへのハード リンクを作成します。

Windows 8 および Windows Server 2012 では、この関数は次のテクノロジでサポートされています。

テクノロジー サポート
サーバー メッセージ ブロック (SMB) 3.0 プロトコル はい
SMB 3.0 透過的フェールオーバー (TFO) いいえ
SMB 3.0 とスケールアウト ファイル共有 (SO) いいえ
クラスター共有ボリューム ファイル システム (CsvFS) はい
回復性のあるファイル システム (ReFS) いいえ
 

SMB 3.0 では、継続的な可用性機能を備えた共有へのハード リンクの作成はサポートされていないことに注意してください。

次のコード スニペットは、CreateHardLink 呼び出して、ファイルのセキュリティ記述子を変更しないようにする方法を示しています。 pszExistingFileName パラメーターには、元のファイル名またはファイルへの既存のリンクを指定できます。 このコードが実行された後、pszNewLinkName はファイルを参照します。

  BOOL fCreatedLink = CreateHardLink( pszNewLinkName, 
                                      pszExistingFileName, 
                                      NULL ); // reserved, must be NULL

  if ( fCreatedLink == FALSE )
   {
    ;// handle error condition
   }

手記

winbase.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして CreateHardLink を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリのみ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winbase.h (Windows.h を含む)
ライブラリ Kernel32.lib
DLL Kernel32.dll

関連項目

CreateFile の

CreateHardLinkTransacted の

DeleteFile の

ファイル管理機能の

ハード リンクとジャンクション

シンボリック リンク の