-3

我需要查看 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 对于具有相同路径的相同文件不同?如果两个不同的文件相同,我该怎么做,我可以用系统调用检查它

4

3 回答 3

3

这是因为您正在打开两个不同的文件:

./a.out ab.txt ab.txt

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

如果您将错误检查放入代码中,那就很清楚了。

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

于 2013-03-30T10:08:10.210 回答
1

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

您想要的字段是st_size.

于 2013-03-30T10:03:01.380 回答
0

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

在 Unix 或 Linux(或 Posix)上,在符合 Posix 的文件系统(如ext4btrfs但不是FAT32)内,一个文件可以没有、一个或多个文件路径。所以文件路径指的是inode。然后,如果两个文件路径指向同一个 inode(在同一个文件系统中),则它们引用同一个底层文件。

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

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

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

 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);

您可以通过首先比较f1f2使用fseek(3)的大小和ftell(3)

你也可以使用普通open(2)的andread(2)close(2)系统调用,确保将块(例如4Kbytes)读入缓冲区(每个文件一个),并注意文件结束条件,并检查错误。

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

于 2013-03-30T10:50:57.770 回答