11

我有一个从文件读取并写入文件的程序。我想阻止用户为两者指定相同的文件(出于显而易见的原因)。假设第一条路径在char* path1,第二条路径在char* path2。我可以fopen()两条路径,fileno()分别调用并获得相同的号码吗?

为了更清楚地解释:

char* path1 = "/asdf"
char* path2 = "/asdf"

FILE* f1 = fopen(path1, "r");
FILE* f2 = fopen(path2, "w");

int fd1 = fileno(f1);
int fd2 = fileno(f2);

if(fd1 == fd2) {
  printf("These are the same file, you really shouldn't do this\n");
}

编辑:

我不想比较文件名,因为使用类似路径/asdf/./asdf或使用符号链接很容易击败它。最终,我不想将我的输出写入我正在读取的文件中(可能会导致严重的问题)。

4

1 回答 1

24

是 - 比较文件设备 ID 和 inode。根据<sys/stat.h>规范

st_ino 和 st_dev 字段共同唯一标识系统中的文件。

采用

int same_file(int fd1, int fd2) {
    struct stat stat1, stat2;
    if(fstat(fd1, &stat1) < 0) return -1;
    if(fstat(fd2, &stat2) < 0) return -1;
    return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino);
}
于 2012-09-19T20:54:31.933 回答