为此使用内存映射文件。 使用UNIX mmap()使用Windows MapViewOfFile()。 这会给你一个映射到文件内容的内存指针。 为什么这是一个好主意? 您不需要为使用malloc()或new()的文件分配空间。 这些文件可以是任何大小,确定32位限制,但应该有一个64位版本。 可以使用
memcmp(文件1,文件2,sizeoffile1)
享受...
编辑比较文件 - 添加了一些代码,用C
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
int
cmpfile(char *file1, char *file2)
{
int result = -1;
int fd1, fd2;
off_t size1, size2;
char *ptr1, *ptr2;
fd1 = open(file1, O_RDONLY);
if (fd1 == -1) {
fprintf(stderr, "Failed to open file '%s' - %s\n", file1, strerror(errno));
goto error1;
}
fd2 = open(file2, O_RDONLY);
if (fd2 == -1) {
fprintf(stderr, "Failed to open file '%s' - %s\n", file2, strerror(errno));
goto error2;
}
size1 = lseek(fd1, 0, SEEK_END);
if (size1 == (off_t)-1) {
fprintf(stderr, "Failed to seek to end of file '%s' - %s\n", file1, strerror(errno));
goto error3;
}
size2 = lseek(fd2, 0, SEEK_END);
if (size2 == (off_t)-1) {
fprintf(stderr, "Failed to seek to end of file '%s' - %s\n", file2, strerror(errno));
goto error4;
}
if (size1 != size2) {
fprintf(stderr, "File sizes mimatched\n");
goto error5;
}
ptr1 = mmap((void *)0, size1, PROT_READ, MAP_SHARED, fd1, 0);
if (ptr1 == MAP_FAILED) {
fprintf(stderr, "Failed to map file '%s' - %s\n", file1, strerror(errno));
goto error6;
}
ptr2 = mmap((void *)0, size2, PROT_READ, MAP_SHARED, fd2, 0);
if (ptr2 == MAP_FAILED) {
fprintf(stderr, "Failed to map file '%s' - %s\n", file2, strerror(errno));
goto error7;
}
if (memcmp(ptr1, ptr2, size1) == 0) {
result = 0;
}
munmap(ptr2, size2);
error7:
munmap(ptr1, size1);
error6:
error5:
error4:
error3:
close(fd2);
error2:
close(fd1);
error1:
return result;
}
int main(int argc, char **argv)
{
int result = -1;
if (argc == 3) {
result = cmpfile(argv[1], argv[2]);
if (result == 0) {
printf("Files match\n");
} else {
printf("Files don't match\n");
}
} else {
fprintf(stderr, "Usage: %s <file1> <file2>\n", argv[0]);
}
return result;
}
如果我理解正确,您的最终目标是根据其内容比较一堆文件。如果是这种情况,您可能需要比较文件的摘要而不是内容,以查看它们是否匹配。 –
@Eugen,要产生一个摘要,整个文件必须被读取,不妨比较读取时......只有这样才会更快,如果你比较一个文件agaist很多,可以重用摘要。 –
@Evan:当我说:“根据他们的内容比较一堆文件”时,这就是我所指的。 –