Определение размера файла, больше, чем 4 ГБ

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (var key in p) {
    if (p.hasOwnProperty(key)) {
        console.log(key + " = " + p[key]);
    }
}
<p>
  Output:<br>
  p1 = values1<br>
  p2 = values2<br>
  p3 = values3
</p>

8
задан Coding Mash 9 September 2012 в 16:20
поделиться

6 ответов

Если Вы находитесь в Windows, Вы хотите GetFileSizeEx (MSDN). Возвращаемое значение является интервалом на 64 бита.

На (странице справочника) linux stat64 корректно. fstat, если Вы работаете с FILE*.

6
ответ дан 5 December 2019 в 07:13
поделиться

Этот код работает на меня в Linux:

int64_t bigFileSize(const char *path)
{
    struct stat64 S;

    if(-1 == stat64(path, &S))
    {
        printf("Error!\r\n");
        return -1;
    }

    return S.st_size;
}
3
ответ дан 5 December 2019 в 07:13
поделиться

(украденный от glibc руководства)

int fgetpos64 (FILE *stream, fpos64_t *position)

Эта функция подобна fgetpos, но положение файла возвращается в переменной типа fpos64_t на который указывает положение.

Если источники компилируются с _FILE_OFFSET_BITS == 64 на машине на 32 бита эта функция доступна под именем fgetpos и так прозрачно заменяет старый интерфейс.

2
ответ дан 5 December 2019 в 07:13
поделиться

Статистика всегда лучше, чем fseek для определения размера файла, это перестанет работать безопасно на вещах, которые не являются файлом. Размеры файла на 64 бита являются операционной определенной вещью, на gcc можно поместить "64" на конец команд, или можно вынудить это выполнить все стандартные вызовы 64 по умолчанию. См. свое руководство компилятора для деталей.

2
ответ дан 5 December 2019 в 07:13
поделиться

На Linux, по крайней мере, Вы могли использовать lseek64 вместо fseek.

1
ответ дан 5 December 2019 в 07:13
поделиться

Игнорируйте все ответы, в которых встречается цифра «64». В Linux вы должны добавить -D_FILE_OFFSET_BITS = 64 в свой CFLAGS и использовать функции fseeko и ftello , которые принимают / возвращают значения off_t . вместо long . Это не часть C, а POSIX. Другим (не Linux) системам POSIX могут потребоваться другие параметры, чтобы гарантировать, что off_t является 64-битным; проверьте свою документацию.

9
ответ дан 5 December 2019 в 07:13
поделиться