0

0

C++如何实现跨平台创建硬链接?(link与CreateHardLink封装)

冰火之心

冰火之心

发布时间:2026-03-06 12:58:03

|

268人浏览过

|

来源于php中文网

原创

硬链接跨平台实现需区分系统约束:linux限同文件系统普通文件,windows需ntfs卷、管理员权限且不支持目录;推荐用c++17的std::filesystem::create_hard_link自动处理差异,手动封装时windows须先adjusttokenprivileges启用权限。

c++如何实现跨平台创建硬链接?(link与createhardlink封装)

硬链接在 Windows 和 Linux 上根本不是一回事

Linux 的 link() 和 Windows 的 CreateHardLink() 表面相似,实则约束完全不同:Linux 硬链接只能指向同一文件系统内的普通文件,不能跨分区、不能指向目录;Windows 要求目标必须是 NTFS 卷,且仅支持文件(同样不支持目录),还强制要求调用进程有 SE_CREATE_HARD_LINK_NAME 权限(通常需管理员或显式提权)。跨平台封装时若只做“函数名映射”,大概率在 Windows 上静默失败或报错 ERROR_PRIVILEGE_NOT_HELD

std::filesystem::create_hard_link 是最稳妥的起点

C++17 引入的 std::filesystem::create_hard_link 已内部处理平台差异,它在 Linux 调用 link(),在 Windows 尝试 CreateHardLinkW() 并自动处理权限检查和错误码转换。但要注意三点:

  • 必须确保编译器启用 C++17(如 GCC 加 -std=c++17,MSVC 用 /std:c++17
  • 目标路径(existing_path)必须已存在且为常规文件;源路径(new_path)不能已存在
  • Windows 下若当前用户无硬链接权限,该函数会抛出 std::filesystem::filesystem_error.code().value() 通常是 5ERROR_ACCESS_DENIED)或 1314ERROR_PRIVILEGE_NOT_HELD

示例:

try {
    std::filesystem::create_hard_link("data.bin", "backup.bin");
} catch (const std::filesystem::filesystem_error& e) {
    // 检查 e.code().value() 判断是权限问题还是路径不存在
}

手动封装时,Windows 必须提前申请权限

如果不用 std::filesystem(比如需支持旧标准),Windows 侧不能直接调 CreateHardLink() 就完事。得先用 AdjustTokenPrivileges() 启用当前进程的硬链接权限,否则必败。这步在 Linux 完全不需要,强行加会编译不过。

海绵音乐
海绵音乐

字节跳动推出的AI音乐生成工具

下载

立即学习C++免费学习笔记(深入)”;

  • Linux 侧:直接调 link(existing_path.c_str(), new_path.c_str()),返回 -1 则查 errno(常见 EPERM 表示跨文件系统,EACCES 表示权限不足)
  • Windows 侧:先调 OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken),再调 LookupPrivilegeValue(NULL, SE_CREATE_HARD_LINK_NAME, &luid),最后 AdjustTokenPrivileges() 启用;之后才可安全调 CreateHardLinkW()
  • 权限调整是一次性操作,只需在进程启动后做一次,不必每次创建都重复

硬链接不是“跨平台通用替代方案”,得先确认是否真需要它

很多场景下开发者想用硬链接是为了“零拷贝共享数据”,但实际落地时容易忽略限制:macOS 不支持硬链接到文件(只支持符号链接),容器环境(如 Docker)挂载卷后常导致跨文件系统,Windows Subsystem for Linux(WSL)里从 Windows 侧创建的硬链接在 Linux 侧不可见。如果只是想避免复制大文件,std::filesystem::copy_file(..., std::filesystem::copy_options::skip_existing) 或内存映射(mmap/CreateFileMapping)反而更可控。

真正要跨平台用硬链接,得接受它只在“原生 NTFS + 原生 ext4/xfs”这种干净环境下才稳定,其他情况建议降级为符号链接或明确报错提示用户。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1029

2024.03.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1408

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1161

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

832

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

461

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2361

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

874

2023.08.10

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

19

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.7万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号