我需要查看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对于具有相同路径的同一文件不相同? 如果两个不同的文件相同,我怎么能这样做,我可以用系统调用来检查它
答案 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的文件系统(如ext4或btrfs但不是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
f2
和ftell(3)
的尺寸来优化上述代码
您也可以使用普通open(2)
和read(2)
以及close(2)
系统调用,请务必将数据块(例如4K字节)读入缓冲区(每个文件一个),然后执行照顾文件结束条件,并检查错误。
正如其他人指出的那样,你的程序是错误的,因为argv[0]
是程序的命令名。