【问题标题】:open larger file with "gnu open" on Windows 64bits in C在 C 中的 Windows 64 位上使用“gnu open”打开大文件
【发布时间】:2018-02-24 07:48:42
【问题描述】:

我正在使用函数

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 有一个标志:O_LARGEFILE 来做。但显然它是bad practice,因为它应该自动完成。

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

【问题讨论】:

  • 在 Windows 上,您使用的是 Cygwin 还是类似的 POSIX 兼容层?如果你这样做,它是 64 位安装的吗?
  • 我不是在 Windows 上编译软件的人,但我相信它是用 mingw 64bits 完成的。
  • MinGW 只不过是移植到 Windows 的 GCC 编译器,它没有 POSIX 兼容层(而open 是一个 POSIX 函数,它在 Windows 中不是标准的)。您可能应该从尝试在 Windows 上构建您的应用程序的人那里获得更多信息。
  • 软件编译得很好。它也在运行。
  • Linux 和 macOS 都是 POSIX 平台,具有原生的open 函数。 Windows 确实没有具有原生的open 函数。 Windows 确实有一些兼容的_open 功能,当然还有像Cygwin 这样的POSIX 兼容系统。在不知道 Windows 系统上使用什么的情况下,无法回答这个问题,它太宽泛了。 需要从在 Windows 上构建它的人那里获得更多信息,并编辑您的问题以包含该信息。

标签: c 32bit-64bit


【解决方案1】:

我可能已经找到了解决方案。 事实上,Windows 不具备 POSIX 兼容性,这就是问题所在(正如 @Some 程序员伙计所提到的那样。 但是 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

现在运行良好。

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多