c语言 - 如何检查两个不同的文件引用是否"strings"引用同一个文件?



在C语言中有一个函数,用来告诉我们两个文件引用是否指向同一个文件。现在,它首先检查传入的参数是否实际上是同一个指针,如果不是,它检查字符,看看字符串是否相同。但这并不能解释引用同一文件的不同方式的可能性。例如…

"d1、d2/d3/theFile"对比"…/d3/theFile">

这些可以是相同的文件,也可以不是,这取决于目录结构和当前引用点的位置。我想改进以下函数,以便能够检查对文件的字符串引用是否与另一个字符串引用相同的文件…

static bool is_same_file (const char *f1, const char *f2) {
if (f1==f2)
return true;
return (0==strcmp(f1,  f2));
}

我想也许可以尝试打开两个文件并以某种方式使用它。但我不知道如何检查打开的文件是否是驱动器上的同一个物理文件,而不是碰巧存在于不同目录中的同一个文件。在c#中,有一个FileInfo类可用于根据引用字符串查找文件,然后您可以比较完整的目录信息、文件名等。在C语言中有类似的方法吗?

在POSIX系统上,您可以使用stat()来检查它们在相同的文件系统上是否具有相同的inode号。

您还应该检查生成号,以处理由于文件被删除和新文件在两次调用之间获得其inode号而导致的竞争条件。

#include <sys/stat.h>
static bool is_same_file (const char *f1, const char *f2) {
struct stat s1, s2;
if (stat(f1, &s1) < 0)) {
perror("stat f1");
return false;
}
if (stat(f2, &s2) < 0)) {
perror("stat f2");
return false;
}
return s1.st_dev == s2.st_dev && s1.st_ino == st.st_ino && s1.st_gen == s2.st_gen;
}

最新更新