Como obter o tamanho de um arquivo [RESOLVIDO]

1. Como obter o tamanho de um arquivo [RESOLVIDO]

João Paulo
haed

(usa FreeBSD)

Enviado em 03/04/2008 - 09:06h

Gostaria de saber como poderia obter o tamanho de um arquivo em C,existe alguma função das bibliotecas padrão?

eu teria de criar minha própia função para calcular o tamanho arquivo?

estu aceitando contribuições de funções dos outros usuário se tiverem alguma função própia...


  


2. MELHOR RESPOSTA

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 03/04/2008 - 09:42h

Esta eu ensino aos alunos, pois funciona em qualquer C e usa apenas o stdio.h.

O que eh feito?
a) Abre o arquivo para leitura
b) posiciona no fim
c) pergunta onde esta (no fim, logo no ultimo byte)

[]'s


#include <stdio.h>

int main (int argc, char *argv[])
{
int i, t;
FILE *arq;

if (argc < 2){
fprintf(stderr, "ERRO: faltou parametro\n");
return(1);
}

for (i = 1; i< argc; i++){
if (! (arq = fopen(argv[i],"r"))){
fprintf(stderr, "ERRO ao tentar abrir %s\n", argv[i]);
continue;
}
fseek (arq, 0, SEEK_END);
t = ftell (arq);
fclose(arq);
printf("===> %s\n", argv[i]);
printf("\tTamanho = %i\n", t);
}
}

3. stat

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 03/04/2008 - 09:20h

Assim como tem o comando stat no Linux:

$ stat /etc/passwd
File: `/etc/passwd'
Size: 1547 Blocks: 8 IO Block: 4096 arquivo comum
Device: 302h/770d Inode: 346397 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
(...)

Tem a chamada de sistema stat:
man 2 stat

(...)
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};



4. tamanho.c

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 03/04/2008 - 09:31h

/* CODIGO FONTE */

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>


int main (int argc, char *argv[])
{
int i;
struct stat s;

if (argc < 2){
fprintf(stderr, "ERRO: faltou parametro\n");
return(1);
}

for (i = 1; i< argc; i++){
if (stat(argv[i], &s)){
fprintf(stderr, "ERRO ao tentar obter stat de %s\n", argv[i]);
continue;
}
printf("===> %s\n", argv[i]);
printf("\tTamanho = %i\n", s.st_size);
printf("\tUltimo acesso = %i\n", s.st_atime);
/* Outros campos, obtidos do man 2 stat :
st_dev ID of device containing file
st_ino inode number
st_mode protection
st_nlink number of hard links
st_uid user ID of owner
st_gid group ID of owner
st_rdev device ID (if special file)
st_size total size, in bytes
st_blksize blocksize for filesystem I/O
st_blocks number of blocks allocated
st_atime time of last access
st_mtime time of last modification
st_ctime time of last status change
*/
}
}

/* TESTES:
$ make tamanho
cc tamanho.c -o tamanho
$ ./tamanho tamanho.c /etc/passwd /etc/shadow
===> tamanho.c
Tamanho = 983
Ultimo acesso = 1207225732
===> /etc/passwd
Tamanho = 1547
Ultimo acesso = 1207225591
===> /etc/shadow
Tamanho = 1015
Ultimo acesso = 1207224641

O tempo eh dado em SEGUNDOS. Tem funcao para converter, inclusive o date da linha de comando faz isto (testando para o tamanho.c):

$ date -d @1207225732
Qui Abr 3 09:28:52 BRT 2008



5. Comparacao

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 03/04/2008 - 09:46h

Solucao com stat: precisa de muitas libs, mas funciona mesmo que tu nao tenhas permissao de ler o arquivo (basta ter permissao para ler o diretorio ONDE esta o arquivo)

Solucao com fseek: somente com stdio.h, mas tu PRECISA ter permissao de leitura no arquivo para poder ver o tamanho.

Exemplo:
Versao stat:

$ ./tamanho /etc/shadow
===> /etc/shadow
Tamanho = 1015
Ultimo acesso = 1207226603

Versao fseek:
$ ./tamanho2 /etc/shadow
ERRO ao tentar abrir /etc/shadow




6. Resolveu?

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 06/04/2008 - 19:12h

Então, resolveu teu problema?


7. Re: Como obter o tamanho de um arquivo [RESOLVIDO]

João Paulo
haed

(usa FreeBSD)

Enviado em 07/04/2008 - 09:21h

respondeu sim cara!!!!valeu pela ajuda!!!

penso que esse tipo de coisa deveia ser ensinada mas em nenhum tutorial de C ou ajuda que li no google tinha informações a respeito!!!

valeu mesmo!!!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts