如何在 c++ 中检查文件路径是否为硬链接并在复制到其他目录时保留它

How to check whether the file path is a hard link and preserve it while copying to other directory in c++

提问人:Witty Apps 提问时间:10/2/2023 最后编辑:Witty Apps 更新时间:10/2/2023 访问量:63

问:

我正在使用下面的代码来创建硬链接并确定文件的硬链接计数是否为 2。

#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
 
int main()
{
    // On a POSIX-style filesystem, each directory has at least 2 hard links:
    // itself and the special member pathname "."
    fs::path p = fs::current_path();
    std::cout << "Number of hard links for current path is "
              << fs::hard_link_count(p) << '\n';
 
    // Each ".." is a hard link to the parent directory, so the total number
    // of hard links for any directory is 2 plus number of direct subdirectories
    p = fs::current_path() / ".."; // Each dot-dot is a hard link to parent
    std::cout << "Number of hard links for .. is "
              << fs::hard_link_count(p) << '\n';
}

这是我在下面为符号链接所做的:

 else if (fs::is_symlink(srcFilePath)){
        std::cout<<srcFilePath;
        std::filesystem::path p(srcFilePath);
            cpSoftLink(srcFilePath, dstFilePath);

    }

void cpSoftLink(const fs::path & srcPath, const fs::path & dstpath){
// if symbolic link already exists then don't create it again
    if ( !fs::exists(dstpath) ) {
         fs::create_symlink(fs::read_symlink(srcPath),dstpath);
        }
}

但是,我想知道硬链接指向的文件再次保留它,同时通过调用将其复制到新目录。create_hardlink

C++ 文件 系统 rsync 硬链接

评论

0赞 Brian61354270 10/2/2023
所有文件都是硬链接!相关新闻: 硬链接和文件有什么区别?
0赞 Ted Lyngmo 10/2/2023
“我想知道硬链接指向的文件” - 您的意思是要查找文件系统中链接到相同内容的所有目录条目吗?C++ 中没有任何东西可以做到这一点,大多数文件系统也没有提供这样做的方法。
0赞 Witty Apps 10/2/2023
@TedLyngmo是的,我想做一些类似于(添加符号链接检查和保留代码)我为符号链接所做的事情。
0赞 Ted Lyngmo 10/2/2023
如果你有一个文件的路径,并且你看到它有 X 个硬链接,那么就没有办法自动找出这些文件在文件系统中的位置。您可以搜索整个文件系统并查找具有相同 inode 的文件,但这可能需要大量时间。
1赞 Remy Lebeau 10/3/2023
@TedLyngmo Windows 上,可以通过与目标文件上的信息类一起使用来查询引用给定目标文件的硬链接。NTQueryInformationFile()FileHardLinkInformation

答: 暂无答案