C на HP Nonstop: как получить размер большого файла > 2 ГБ?

Я работаю над приложением C, которое работает на HP-Nonstop, и ему нужно получить размер файлов на диске. Уже реализованный способ сделать это заключается в следующем:

      char *filename;
short itemlist;
long fileLength = 0;
short retCode;

itemlist = 142; /* file size */
retCode = FILE_GETINFOLISTBYNAME_( filename,
                                 (short)strlen(filename),
                                 &itemlist,
                                 1,
                                 (short*)&fileLength,
                                 sizeof(fileLength) );

Как я читал в документации, это работает только для файлов размером не более 2 ГБ:

Если файл, на который ссылаются, представляет собой [...] файлы OSS, размер которых превышает примерно 2 гигабайта, коды элементов будут возвращать -1 без индикации ошибки.

Таким образом, мои вопросы:

  • Как я могу получить размер файлов больше 2 ГБ?
  • Есть ли способ посмотреть, какFILE_GETINFOLISTBYNAME_реализовано? Возможно, можно было бы написать собственную реализацию для больших файлов.

1 ответ

Не уверен, почему опция 142 не возвращает размер файла размером 2 ГБ, даже если для возврата размера используется 32-битная переменная без знака.

Вы можете использовать опцию 191, которая вернет размер в 64-битной переменной.

Вот документация для опции 142, в которой рекомендуется использовать опцию 191 для файлов большего размера.

Совокупный EOF. Для дисковых объектов значение конца файла файла. Для разделенного файла, в котором был открыт весь файл, возвращается значение конца файла для всего файла. Возвращаемое значение %hFFFFFFFF указывает, что значение конца файла не может поместиться в этот четырехбайтовый атрибут без знака. В этом случае для получения значения конца файла используйте восьмибайтовый атрибут с кодом элемента 191. Заменен элементом 191.

Другие вопросы по тегам