如何使用系统调用确定c中的两个文件是否相同

时间:2013-03-30 09:59:24

标签: c linux file system-calls stat

我需要查看2个文件是否相同 所以我用过 struct stat

    fdin = open(argv[0],O_RDONLY);
    statos= fstat(fdin, &stat);
    close(fdin);
    fdin = open(argv[1],O_RDONLY);
    statos1= fstat(fdin, &stat1);
    close(fdin);
    printf("file 1 is in size: %lu\n",stat1.st_ino);
    printf("file 2 is in size: %lu\n",stat.st_ino);

结果

file 1 is in size: 9569486
file 2 is in size: 9569479

为什么st.ino对于具有相同路径的同一文件不相同? 如果两个不同的文件相同,我怎么能这样做,我可以用系统调用来检查它

3 个答案:

答案 0 :(得分:3)

这是因为你打开了两个不同的文件:

./a.out ab.txt ab.txt

argv[0]是可执行文件,argv[1]是'ab.txt'。

如果您对代码进行了错误检查,那就很清楚了。

由于某种原因,您还将inode打印为“大小”。

答案 1 :(得分:1)

st_ino是文件的inode编号的字段,inode编号是每个文件结构的唯一标识符。 inode结构保存stat调用返回的有关文件的信息。

您想要的字段是st_size

答案 2 :(得分:0)

您没有定义 相同的文件对您来说意味着什么

在Unix或Linux(或Posix)上,在符合Posix的文件系统(如ext4btrfs但不是FAT32)内,文件可以包含无,一个或多个文件路径。所以文件路径引用inodes。然后,如果两个文件路径指向相同的inode(在同一文件系统中),则它们引用相同的基础文件。

您可以使用stat(2)系统调用来获取某些文件路径的设备(即文件系统)st_dev和inode编号st_ino。然后你应该比较它们。

或者,您可以想象相同文件对您来说意味着具有相同内容。这是一个定义不明确的定义:文件的内容可能会发生变化(因为它同时由write(2)写入,通过某些mmap(2)等等......由某些其他过程写入)你正在读它。所以 stricto sensu 比较文件内容(这是一项昂贵的操作)没有意义内容可以被某些人更改<比较期间的em>其他进程

如果您错误地忽略了文件内容可以更改的事实(因为另一个进程在您正在读取它的同时写入它),您可以读取这两个文件并比较每个字节(同时考虑到 - 的文件)。简单的事情:

 FILE *f1 = fopen(path1, "r");
 if (!f1) {  perror(path1); exit(EXIT_FAILURE);  };
 FILE *f2 = fopen(path2, "r");
 if (!f2) {  perror(path2); exit(EXIT_FAILURE);  };
 bool samefile = true;
 int c1, c2;
 while (samefile && ((c1 = getc(f1)) != EOF) || (c2 = getc(f2)) != EOF))
    if (c1 != c2) samefile = false;
 fclose (f1), fclose (f2);

您可以使用fseek(3)f1

首先比较f2ftell(3)的尺寸来优化上述代码

您也可以使用普通open(2)read(2)以及close(2)系统调用,请务必将数据块(例如4K字节)读入缓冲区(每个文件一个),然后执行照顾文件结束条件,并检查错误。

正如其他人指出的那样,你的程序是错误的,因为argv[0]是程序的命令名。