PDA

Ver la Versión Completa : mostrar tamaño


Chupi
23-12-2004, 14:55:38
Hola, me gustaria saber como poner el tamaño de un archivo especifico en Kbytes, en un form, y ahora no se si es con cualquier objeto o alguno especidico.

GRACIAS.

Neftali [Germán.Estévez]
23-12-2004, 15:23:41
Prueba con ésta función.


function GetFileSize(FileName: string): longint;
var
Srec: SearchRec;
begin
FindFirst(FileName, $01+$04+$20, Srec);
if DosError = 0 then
GetFileSize := Srec.Size
else
GetFileSize := 0;
end;

Chupi
23-12-2004, 15:51:34
Me funcionó con otra función que encontre en la web, pero muchas gracias.

[Gunman]
12-11-2005, 13:03:15
Yo he probado esta función y la FileSize() pero ambas en algunos archivos me devuelven un valor negativo, que pasa? El valor negativo en si no me preocupa (he hecho una función que recoge el valor absoluto de un numero de coma flotante), si que me preocupa que en algunos archivos, no sé porqué no me devuelve el tamaño real. Los casos que he detectado han sido con archivos superiores a 2GB, pero no me explico porqué con unos si que sucede y con otros no. A alguien le ha ocurrido lo mismo? Alguien sabe como remediarlo? Muchas gracias!
A continuación pongo el código de la función:

{Función general para obtener el tamaño de un archivo}
function GetFileSize(FileName: String): String;
{Función para saber si el FileName indicado es una carpeta}
function IsFolder(Folder: String): Boolean;
var
Attributes:Word;
begin
Attributes:=FileGetAttr(Folder);
Result:=(Attributes and faDirectory)=faDirectory;
end;

{Función que devuelve el Valor Absoluto de un número Real}
function AbsoluteValue(Value: Real): Real;
begin
if Value < 0 then
Result := -(Value)
else
Result := Value;
end;
var
F: File of Byte;
Size: Real;
begin
if IsFolder(FileName) = False then
begin
{Si el FileName indicado no es una carpeta recoge su tamaño}
AssignFile(f, FileName);
Reset(f);
try
SetRoundMode(rmNearest);
Size := FileSize(f);
{Para archivos que tienen un tamaño a partir de un GB}
if (Size > 1073741824) or (Size < -1073741824) then
Result := FloatToStr(RoundTo(AbsoluteValue(Size/1073741824),-2))+' Gb'
else
{Si el archivo es superior a un megabyte}
if (Size > 1048576) or (Size < -1048576)then
Result := FloatToStr(RoundTo(AbsoluteValue(Size/1048576),-2))+' Mb'
else
{Si el archivo es superior a un kilobyte}
if (Size > 1024) or (Size < -1024) then
Result := FloatToStr(RoundTo(AbsoluteValue(Size/1024),-2))+' Kb'
else
{Si el archivo tiene unos pocos bytes}
if (Size = 0) then
Result := '1 b'
else
Result := FloatToStr(Size)+ ' b';
finally
CloseFile(f);
end;
end
else //Si el FileName es una carpeta no devolverá ningún carácter
Result := '';
end;

[Gunman]
12-11-2005, 13:06:16
Mmmmm... Mientras escribia el post me he dado cuenta que quizás el valor que devuelve en negativo no corresponda a su valor real, quiero decir: que quizás no sólo se tenga que cambiar de signo el integer, sino que se ha de hacer otra operación (que desconozco, por cierto...) Bueno, de todas formas si alguien sabe como obtener correctamente el tamaño de un archivo le agradeceria si me contestara el post.

Lepe
12-11-2005, 13:59:23
No recuerdo exactamente, creo que FileSize te devuelve dos Cardinal o LongInt, y debe pasarse a un Int64 usando Low() y High()

// Int64 9.223.372.036.854.775.808
// Cardinal 4.294.967.295
// Longint 2.147.483.647


Con un LongInt, solo puede llegar a 2.1 GB más o menos.

saludos

Lepe
12-11-2005, 14:19:03
procedure TForm1.Button1Click(Sender: TObject);
function GetFileSize(FileName: string): int64;
var
Srec: TSearchRec;
begin
if FindFirst(FileName, $01+$04+$20, Srec) <>0 then
Result := Srec.FindData.nFileSizeHigh *MAXDWORD +
Srec.FindData.nFileSizeLow
else
result := 0;
findclose(Srec);

end;
begin
Canvas.TextOut(10,10,IntToStr(GetFileSize('c:\pagefile.sys')));
end;

No tengo a mano un archivo de muchos gigas, probadlo, pero debe funcionar.

El tamaño que muestra, es el mismo que en propiedades de ese archivo, pero en bytes, el que pone el explorador, ya sabemos que es un valor aproximado.

saludos

[Gunman]
13-11-2005, 13:03:02
Lepe, he usado tu función (un poco modificada) y en todos los items me devuelve 0 como valor. Aquí pongo la función:

function GetFileSize(FileName: String): Int64;
function IsFolder(Folder: String): Boolean;
var
Attributes:Word;
begin
Attributes:=FileGetAttr(Folder);
Result:=(Attributes and faDirectory)=faDirectory;
end;

function AbsoluteValue(Value: Real): Real;
begin
if Value < 0 then
Result := -(Value)
else
Result := Value;
end;
var
Srec: TSearchRec;
Size: Real;
begin
if FindFirst(FileName,faAnyFile and not faSysFile or faHidden, Srec) <> 0 then
Result := Srec.FindData.nFileSizeHigh *MAXDWORD +
Srec.FindData.nFileSizeLow
else
Result := 0;
FindClose(Srec);
end;


Bueno, por si te sirve de algo también te pongo el código de llamada a la función:

procedure TMainFrm.LcListData(Sender: TObject; Item: TListItem);
var
FInfo: TSHFileInfo;
begin
Item.Caption := FileList[Item.Index];

Item.SubItems.Add(IntToStr(GetFileSize(IncludeTrailingPathDelimiter(CDirLCCB.Text)+
Item.Caption)));

SHGetFileInfo(PAnsiChar(IncludeTrailingPathDelimiter(CDirLCCB.Text)+
Item.Caption),0,FInfo,SizeOf(FInfo),SHGFI_TYPENAME);

Item.SubItems.Add(FInfo.szTypeName);
end;

Lepe
13-11-2005, 22:21:01
if FindFirst(FileName,faAnyFile and not faSysFile or faHidden, Srec) <> 0 then


Perdona Gunman, fue un fallo técnico, en realidad la comparación es

if FindFirst(...) = 0 then // si se ha encontrado

saludos

Neftali [Germán.Estévez]
14-11-2005, 10:04:58
Me funcionó con otra función que encontre en la web, pero muchas gracias
Sería un gran detalle que compartieras con nosotros ese conocimiento... (la función que te funcionó, vamos... :D)