quarta-feira, 21 de janeiro de 2009

Obtendo tamanho de arquivos

Alguma vez já pensou numa rotina para saber o tamanho de um arquivo? Bom, e isso é bem simples de fazer, com a declaração de uma única função já conseguimos resolver nosso problema, veja:

function TForm1.TamanhoArquivo(Arquivo: string): Integer;
begin
with TFileStream.Create(Arquivo, fmOpenRead or fmShareExclusive) do
try
Result := Size;{resultado em bytes}
finally
Free;
end;
end;


Agora para mostrar um resultado, você pode adicionar à tela um componente OpenDialog e um Button, adicionando ao evento OnClick do button o seguinte código:

if OpenDialog1.Execute then
begin
ShowMessage('Tamanho do arquivo é '+FloatToStr(TamanhoArquivo(OpenDialog1.FileName)/1024));
end;


Agora simples, implemente a função nas suas rotinas de programação, deixando seus sistemas mais funcionais. Por ora seria isto, até a próxima.

6 comentários:

Bruno Stuani disse...

Dois comentários.

1 - o Size do FileStream é um integer de 64bits, já o Integer normal é 32bits. Para arquivos maiores que 2gb se não me engano essa função não vai retornar o tamanho certo porque o resultado dela é Integer. Basta mudar o tipo do Result para Int64 que já resolve este problema.

2 - É possível saber o tamanho do arquivo sem ter que abrí-lo, assim economiza-se recursos. Basta usar a API FindFirst e brincar com a estrutura FindData que tem o tipo TWin32FindData. Nela tem o SizeLow e o SizeHigh, com ambos você consegue fazer um Int64 para retornar o tamanho do arquivo sem ter que abrí-lo.

Maurício Vinicius de O. Santos disse...

Opa...
peguei o end. do seu blog pelo forum do imasters, eu fiz uma pergunta sobre SOAP/DataSnap...
vou acompanhar seu blog...acompanhe o meu tb:
devutils.blogspot.com
É sempre bom trocar informações.

Abraços.

William de Oliveira Ferreira disse...

Bom, eu analisei o código e gostaria de perguntar porque não usar os

FileSize()
SizeOf()

Maikel Scheid disse...

A função sizeof retorna o tamanho de armazenamento, em bytes de uma variável ou tipo. Muitas vezes, é útil saber exatamente o espaço de dados utilizado, principalmente quando se utilizam rotinas como GetMem.
Alguns tipos dão sempre o tamanho de um ponteiro, uma vez que eles são apenas isso - ponteiros para o tipo de dados onde são armazenados. Por exemplo strings.
Utilize o InstanceSize método para obter o tamanho de um objeto.

O FileSize por sua vez é uma função que retorna o tamanho de um arquivo aberto, porém antes de usá-lo, o arquivo deverá ser atribuído a um handle usando o AssignFile e abrir utilizando um Append. Tome cuidado no tipo da declaração de variáveis que receberão o resultado desta função. Veja comentário realizado neste post pelo Bruno.

Bom, acho que isso ajuda a esclarecer suas dúvidas. Abraços

Unknown disse...

Como faço para saber o tamanho de um arquivo. só que este arquivo estando na web.

ou seja, só em colocar a url EX. http://www.servidor.com.br/arquivo.exe e ai ele mi retorna o tamanho.

Maikel Scheid disse...

Olá gleury, segue resposta a sua pergunta em um novo post que fiz no blog, aliás, está um pouco mais complexo onde além de mostrar como obter o tamanho do arquivo, mostro como fazer o download e obter a taxa de transferência do mesmo. Segue link:
http://maikelscheid.blogspot.com/2010/10/download-de-arquivos-da-internet.html

Att
Maikel Scheid