Pergunta

O código atualmente faz isso eo fgetpos faz arquivos alça maior do que 4 GB, mas o retorno procuram um erro, portanto, qualquer idéia de como buscar o fim de um file > 4GB?

fpos_t currentpos;

sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");

fgetpos(fp,&currentpos);
m_filesize=currentpos;
Foi útil?

Solução

Se você estiver no Windows, você quer GetFileSizeEx ( MSDN) . O valor de retorno é um int de 64 bits.

No linux stat64 (manpage) está correto. fstat se você estiver trabalhando com um arquivo *.

Outras dicas

Ignorar todas as respostas com "64" que aparece nelas. No Linux, você deve adicionar -D_FILE_OFFSET_BITS=64 ao seu CFLAGS e usar as funções fseeko e ftello que tomam valores off_t / retorno em vez de long. Estes não fazem parte do C, mas POSIX. Outros sistemas (não-Linux) POSIX podem precisar de diferentes opções para garantir que off_t é de 64-bit; verifique a documentação.

Esse código funciona para mim no 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;
}

(roubado do manual do glibc)

int fgetpos64 (FILE *stream, fpos64_t *position)

Esta função é similar a fgetpos mas da posição do arquivo é retornado em uma variável do tipo fpos64_t aos quais pontos de posição.

Se as fontes são compilados com _FILE_OFFSET_BITS == 64 em uma máquina de 32 bits esta função está disponível sob o nome fgetpos e assim transparente substitui a interface antiga.

Stat é sempre melhor do que fseek para determinar o tamanho do arquivo, ele irá falhar com segurança em coisas que não são um arquivo. 64 filesizes bit é uma coisa específica operacional, no gcc você pode colocar "64" no final dos comandos, ou você pode forçá-lo a fazer todas as chamadas padrão 64 por padrão. Consulte o manual do compilador para obter detalhes.

No Linux, pelo menos, você poderia usar lseek64 vez de fseek.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top