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.