在C语言中检测文件系统

4
有没有一种方法可以在C语言中判断文件是在本地磁盘还是NFS上?这段代码应该跨越各种Linux发行版,并且不应该依赖于系统调用(例如stat-f)。

为什么你不想进行系统调用?使用stat是典型的方法。 - Jarek
@Jarek:stat 不可移植。 - Dan Paradox
2
@DanParadox:我们在谈论系统调用stat,而不是带有stat的system()调用,对吧?因为根据它的man页,系统调用stat符合SVr4、4.3BSD、POSIX.1-2001在Linux上的标准。这相当具有可移植性。 - thiton
@DanParadox:你完全混淆了系统调用和对 system() 函数的调用... - user405725
1个回答

8

您想要从<sys/vfs.h>使用statfs

int statfs(const char *path, struct statfs *buf);

struct statfs {
    __SWORD_TYPE f_type;    /* type of file system (see below) */
这是如何使用它的:
struct statfs s;
if (statfs("/etc", &s))
    perror("statfs");

switch (s->f_type) {
case EXT2_SUPER_MAGIC:
    break;
case EXT3_SUPER_MAGIC:
    break;
default:
    break;
}

另外:

  • 您混淆了“外部命令”和“系统调用”。它们是非常不同的东西。
  • stat(1) 命令在 Linux 发行版中非常便携。

谢谢您的回答,但有没有办法将这个用于特定的文件? - Dan Paradox
@DanParadox 如果你仔细看,你会在statfs中看到一个路径参数。 - sidyll
警告:不要测试etx2/etx3——我的Fedora16本地文件系统是BTRFS,这可能很快成为新的默认文件系统——XFS、ReiserFS等也有同样的问题。因此,应该测试你想要排除的文件系统,如NFS和SMB。 - Soren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接