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)。 若要获取扩展的错误信息,请调用 GetLastError

可以使用此函数创建的最大硬链接数为每个文件 1023 个。 如果为文件创建了 1023 个以上的链接,则会出现错误。

如果将名称长于 MAX_PATH 个字符传递给 lpFileNamelpExistingFileName 参数,或者传递给此函数的 Unicode 版本,而不将“\?”追加到路径,则函数将返回ERROR_PATH_NOT_FOUND。

言论

使用 CreateFileCreateHardLink 创建的文件的任何目录条目都是指向关联文件的硬链接。 使用 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 标头将 CreateHardLink 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows XP [仅限桌面应用]
支持的最低服务器 Windows Server 2003 [仅限桌面应用]
目标平台 窗户
标头 winbase.h (包括 Windows.h)
Kernel32.lib
DLL Kernel32.dll

另请参阅

CreateFile

CreateHardLinkTransacted

DeleteFile

文件管理功能

硬链接和接合

符号链接