爲此使用內存映射文件。 使用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:當我說:「根據他們的內容比較一堆文件」時,這就是我所指的。 –