fseek с SEEK_END возвращает ошибку «Недопустимый аргумент» для управления большими данными (7 ГБ) с помощью библиотеки расширения python x86 C на windows7 x64

#python #large-files #python-c-extension

#python #большие файлы #python-c-extension

Вопрос:

Я пытался управлять большими двоичными данными ( 7GB ) в оригинальной библиотеке расширений python x86.
Но fseek with SEEK_END работает плохо.

Я поставил _FILE_OFFSET_BITS 64 макрос. Я тоже пытался fseeko64 , но это вызывает ошибку.
С файлами размером менее 2 ГБ или с использованием SEEK_CUR, SEEK_SET это работает нормально.

Я застрял на пару дней. Кто-нибудь может дать мне идеи?

 #define _GNU_SOURCE
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
#include <Python.h>
#include "structmember.h"
#include <stdio.h>

static PyObject *
MyClass_load(MyClass* self, PyObject *args)
{
  const char* file_path;
  if (!PyArg_ParseTuple(args, "s",  amp;file_path))
    return NULL;

  self->fp = fopen(file_path ,"rb");
  if (self->fp == NULL) {
    PyErr_SetString(PyExc_IOError, "File does not exist.");
    return NULL;
  }
  off_t offset = 0;
  if(fseek(self->fp, offset, SEEK_END) != 0){
    printf("%sn", strerror(errno)); // show "Invalid argument"
    PyErr_SetString(PyExc_IOError, "Seek failed.");
    return NULL;
  }

  Py_INCREF(Py_None);
  return Py_None;
}
 

Окружающая среда:

  • Windows 7 x64
  • Python 2.7 x86
  • MinGW GCC

Ответ №1:

Использование ‘_fseeki64’ и ‘_ftelli64’, например, VC, работает отлично. Я знаю, что я все еще использую gcc для компиляции файла c в файл библиотеки python c, но я не знаю, почему я могу использовать код VC в gcc. В любом случае, проблема была решена!