Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   como saber el tamaño de un fichero (https://www.clubdelphi.com/foros/showthread.php?t=69336)

kenychy 11-08-2010 15:49:43

como saber el tamaño de un fichero
 
hola loquillos,tengo un pequeño problema que necesito que me ayuden a resolver, estoy haciendo un copiador, y necesito saber el tamaño de los archivos, cosa que no puedo hacer ya que el tamaño de un archivo de 7gb en bytes es enorme y no tengo un tipo de variable que pueda soportar números tan grande, estuve probando con el long double pero cuando lo saco por el label lo que me sale es -1, no se si esto es problema de conversión o es que este tipo de dato no soporta números tan grande.
Yo creo que windows ya tiene almacenado en algún lugar el tamaño de cada archivo, conjuntamente con la fecha en que se creo y etc. me gustaría saber como puedo acceder a esa información. les agradecería mucho si me ayudaran lo mas rápido posible.

Neftali [Germán.Estévez] 11-08-2010 17:21:44

Esto me funciona con fichero de más de 3gb (el primero que he encontrado por mi disco):

Código Delphi [-]
var
  Size:Int64;
begin

  // Existe?
  if FileExists(edtFileSize1.Text) then begin
    Size := Self.GetFileSize(edtFileSize1.Text);
  end;

Y con este procedimiento puedes cambiarlo a diferentes unidades:

Código Delphi [-]
procedure TFormMain.ConvertFileSizes(Size:Int64; sizeKB:Double=0; sizeMB:Double=0);
begin

  // Bytes
  edtbytes.Text := IntToStr(Size) + '  b';

  // KB
  sizeKB := (Size / 1024);
  edtKB.Text := FloatToStrF(SizeKB, ffFixed, 18 ,2) + ' KB';

  // MB
  SizeMB := (Size / 1048576);
  edtMB.Text := FloatToStrF(SizeMB, ffFixed, 18 ,2) + ' MB';

  // GB
  edtGB.Text := FloatToStrF((Size / 1073741824), ffFixed, 18 ,2) + ' GB';
end;


kenychy 11-08-2010 18:29:20

tio, yo necesito ese mismo ejemplo pero en C++ bulider y pruevalo con un fichero de mas de 5 gb, porque lo que yo hice tambien funciona con ficheros de este tamaño pero no de mas de 5 gb. y yo necesito saber el tamaño de un fichero sin inportar su tamaño, como si este fuera de 40 gb.

escafandra 11-08-2010 20:38:05

Repasa este hilo, ya tratamos el tema ;).

Saludos.

Neftali [Germán.Estévez] 12-08-2010 10:41:59

Ok, en este caso hay que calcularlo "por partes"; Modifica el código y utiliza el siguiente:

Código Delphi [-]
var
  hdl: THandle;
  FileData: TWin32FindData;
  Size:int64;
begin
  // ini
  Size := 0;
  // Handle del fichero
  hdl := FindFirstFile(PChar(edtFileSize1.text), FileData);
  // Correcto?
  if (hdl <> INVALID_HANDLE_VALUE) then begin
    Windows.FindClose(hdl);
    Int64Rec(Size).Lo := FileData.nFileSizeLow;
    Int64Rec(Size).Hi := FileData.nFileSizeHigh;
  end;
  // Convertir
  ConvertFileSizes(Size);

Si lo pruebas ahora con un fichero de grande (en mi caso con uno de más de 7 gb) obtengo esto:


kenychy 12-08-2010 16:00:04

Cita:

Empezado por Neftali (Mensaje 373284)
Ok, en este caso hay que calcularlo "por partes"; Modifica el código y utiliza el siguiente:

Código Delphi [-]
var
  hdl: THandle;
  FileData: TWin32FindData;
  Size:int64;
begin
  // ini
  Size := 0;
  // Handle del fichero
  hdl := FindFirstFile(PChar(edtFileSize1.text), FileData);
  // Correcto?
  if (hdl <> INVALID_HANDLE_VALUE) then begin
    Windows.FindClose(hdl);
    Int64Rec(Size).Lo := FileData.nFileSizeLow;
    Int64Rec(Size).Hi := FileData.nFileSizeHigh;
  end;
  // Convertir
  ConvertFileSizes(Size);

Si lo pruebas ahora con un fichero de grande (en mi caso con uno de más de 7 gb) obtengo esto:


hola tio, acabo de probar tu codigo y me da error en Int64Rec(Size).Lo y Int64Rec(Size).Hi, el error dice; {DCC ERROR} Unit1.pas(41): E2018 Record, objet or class type required.

kenychy 12-08-2010 16:05:46

hola tio, acabo de probar tu codigo y me da error en Int64Rec(Size).Lo y Int64Rec(Size).Hi, el error dice; {DCC ERROR} Unit1.pas(41): E2018 Record, objet or class type required.

escafandra 12-08-2010 16:07:41

Cita:

Empezado por kenychy (Mensaje 373308)
hola tio, acabo de probar tu codigo y me da error en Int64Rec(Size).Lo y Int64Rec(Size).Hi, el error dice; {DCC ERROR} Unit1.pas(41): E2018 Record, objet or class type required.

:eek: ¿Estamos hablando en C++ o en delphi? o me he equivocado de foro...:rolleyes::D

Saludos.

kenychy 12-08-2010 16:31:58

tu codigo yo lo probe en delphi 2010, y me dio error. que tu cres de esto.

Neftali [Germán.Estévez] 12-08-2010 16:55:44

Cita:

Empezado por escafandra (Mensaje 373310)
¿Estamos hablando en C++ o en delphi? o me he equivocado de foro...

Estamos hablando de C++.

Yo tenía código en Delphi y lo coloqué asumiendo que tal vez le serviría; Supongo que si no ha dicho nada es porque más o menos lo entiende o lo puede traducir.

Neftali [Germán.Estévez] 12-08-2010 16:58:52

1 Archivos Adjunto(s)
Cita:

Empezado por kenychy (Mensaje 373312)
tu codigo yo lo probe en delphi 2010, y me dio error. que tu cres de esto.

El código lo he probado con D6 y D2009 y me funciona bien en ambos.
Te subo el proyecto.

kenychy 12-08-2010 17:18:21

gracias man

escafandra 12-08-2010 18:21:56

Dos funciones en C:

Código:

__int64 GetFileSize(char *FileName)
{
  WIN32_FIND_DATA Data;
  HANDLE hFile = ::FindFirstFile(FileName, &Data);
  if(hFile==(HANDLE)-1) return 0;
  __int64 S = Data.nFileSizeHigh;
  S = (S << 32) | Data.nFileSizeLow;
  FindClose(hFile);
  return S;
}

//-----------------------------------------------------------------------
__int64 _GetFileSize(char *FileName)
{
  int hFile= _lopen(FileName, 0);
  __int64 S;
  if (!GetFileSizeEx((HANDLE)hFile, (PLARGE_INTEGER)&S)) S=0;
  _lclose(hFile);
  return S;
}


Saludos.

kenychy 19-11-2010 16:46:59

gracias men.


La franja horaria es GMT +2. Ahora son las 16:04:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi