c - 如何比较 C 中的两个(绝对)路径(以 char* 形式给出)并检查它们是否相同?

标签 c

给定两个路径作为 char*,我无法确定这两个路径是否指向同一个文件。 如何在 C 中实现独立于平台的实用程序来检查路径是否指向同一文件。

使用 strcmp 将不起作用,因为在 Windows 上路径可以包含\或/ 使用 ist_ino 将无济于事,因为它在 Windows 上不起作用

    char *fileName = du->getFileName();
    char *oldFileName = m_duPtr->getFileName();
    bool isSameFile = pathCompare(fileName, oldFileName) == 0;//(strcmp(fileName, oldFileName) == 0);
    if (isSameFile){
        stat(fileName, &pBuf);
        stat(oldFileName, &pBuf2);

        if (pBuf.st_ino == pBuf2.st_ino){
            bRet = true;
        }
    }

最佳答案

你不能。 Windows 上也存在硬链接(hard link),C 标准库没有对其进行操作的方法。

更大问题的可行解决方案:链接到 cygwin1.dll 并使用 st_ino 方法。您从示例代码中省略了 st_dev,需要将其放回去。

虽然在 Windows 上有一种实际的方法可以实现这一点,但它涉及到 ntdll 方法,我必须阅读 Cygwin 的代码才能找出如何做到这一点。

方法是 NtGetFileInformationByHandle 和 NtFsGetVolumeInformationNyHandle。有记录的 kernel32 调用声称可以做同样的事情。请参阅 cygwin 源代码以了解它们为何无法正常工作(有问题的 fs 驱动程序)。

关于c - 如何比较 C 中的两个(绝对)路径(以 char* 形式给出)并检查它们是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56582169/

相关文章:

arrays - 结构体数组成员地址问题

c++ - 手册页 : How to use arguments

C linux相当于windows QueryPerformanceCounter

arrays - 为什么在初始化指针时必须将数组转换为 type[]?

C 信号与事件处理程序

c - 嵌入式:U-boot 终端中 Ctrl-C 中断的 C 编码

c++ - C++98 互斥体中共享数组的锁定变量

android - 是否可以在Android上运行C程序

c - 有许多不同类型的堆栈

c - 适用于 Windows 的最简单的 C 编译器和编辑器?