在 C 中的 Windows 64 位上用 "gnu open" 打开大文件

open larger file with "gnu open" on Windows 64bits in C

我正在使用函数

int open (const char *filename, int flags[, mode_t mode])

在我的代码中打开文件。

    file->fd = open(filename, O_RDWR | O_BINARY);
    if (file->fd == -1) {
        perror("cannot open file");
        return -1;
    }

我的代码在 GNU/linux(64 位)上 运行 很好,但在 Windows(64 位)上我无法打开大于 4Go 的文件。 我会理解我在 32 位系统上遇到这种问题,但我不明白为什么在 Windows 64 位系统上会出现这种情况。 我读过 documentation 并且有函数 open64。但是这个函数专用于 32 位系统,这不是我的情况(不关心 32 位系统)。

我不认为这个主题是双倍的,因为我读过的所有主题都解释了如何使用宏 -D_FILE_OFFSET_BITS=64-D_LARGEFILE_SOURCE=1,但它同样适用于 32 位系统。 我也 read that there's a flag: O_LARGEFILE to do it. But apparently it is a bad practice 因为它应该自动完成。

我被卡住了,我不想更改我的所有代码以使用 fopen,所以如果有人有打开大文件并在 Windows 中打开的解决方案,那可能会很棒。

我可能找到了解决办法。 确实 Windows 没有 POSIX 兼容性,这就是问题所在(正如@Some programmer dude 所提到的。 但是 open 函数可以完成这项工作。问题来自lseek。 我需要做这样的事情:

#ifdef WIN32
#include <io.h>
#endif
...
#ifdef WIN32
#define lseek64 _lseeki64
#else
#define lseek64 lseek
#endif

那么,lseek 的类型就是off_t。但是这个类型也是POSIX标准的。所以,我做的最后一件事是用 int64_t.

替换所有 off_t

它现在运行良好。