在 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
它现在运行良好。
我正在使用函数
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
它现在运行良好。