【发布时间】:2021-01-21 16:06:07
【问题描述】:
我们在纯 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 中做类似的事情?
【问题讨论】:
-
我认为没有任何独立于操作系统的方式。在 Unix 上,您可以使用
stat()并检查st_dev和st_ino是否相同。 -
POSIX 具有
realpath函数来返回路径名的规范化绝对路径名。这听起来与您描述的 C#FileInfo类获取完整路径名的能力相似。 -
@IanAbbott
realpath()只保证返回“an 绝对路径名,其命名相同的文件,其解析不涉及'。' , '..' 或符号链接。”具有多个硬链接的文件将具有多个绝对路径名。 POSIX 系统中没有“规范”路径名。