Determinar o tamanho de um arquivo maior do que 4 GB
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,¤tpos);
m_filesize=currentpos;
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.