Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Saber el Tamano de un Archivo de texto (https://www.clubdelphi.com/foros/showthread.php?t=73909)

oscarac 24-05-2011 08:55:09

Saber el Tamano de un Archivo de texto
 
buenas madrugadas

estoy haciendo un modulo de migracion de datos, el cual captura datos desde un archivo plano (TXT), entonces para hacer mas vistoso el programita le puse un progressbar

ahora viene mi duda.... como se el tamano del archivo de texto para colocarlo en la propiedad MAX del Progress?

cuanto es lo que lee con esta instruccion? para ir avanzando el progress

Código Delphi [-]
 
ReadLn( F, sLinea );

si alguien pudiera iluminarme.. estare agradecido

saludos

Casimiro Notevi 24-05-2011 08:57:32

Por ejemplo: FileSize

oscarac 24-05-2011 09:06:25

esto es lo que estoy haciendo

Código Delphi [-]
procedure TfrmActualizacion.CargarArchivoTexto;
var F: TextFile;
sLinea: String;
_Tamanio : Double;
begin
  AssignFile( F, edtArchivo.Text);
//  _Tamanio := FileSize(f);
  Reset( F );
  while not Eof( F ) do
  begin
    ReadLn( F, sLinea );
  end;
  CloseFile( F );
end;

porque cuando quiero ponerle un break no "para" el programa donde se supone debe parar :confused::confused:

Casimiro Notevi 24-05-2011 09:13:27

Cita:

Empezado por oscarac (Mensaje 401093)
[..]porque cuando quiero ponerle un break no "para" el programa donde se supone debe parar :confused::confused:

Explícate, es que todavía no me he tomado el café y estoy algo dormido :)

oscarac 24-05-2011 09:16:03

pues creo que ya debo dormir son las 2:30 am aqui

gracias ya lo vere mas tarde cuando vaya a la oficina en 5 horas

ecfisa 24-05-2011 12:38:32

Hola Oscarac.

Al tratarse de un archivo secuencial creo que vas a tener que hacer una lectura previa para contar el número de líneas si querés que la barra se comporte
de forma representativa. La función FileSize devuelve el número de registros de un archivo tipeado. Si el archivo no tiene tipo, como es el caso, toma por defecto un registro de 128 bytes.

Código Delphi [-]
...
function TForm1.NumFileLines(NomArch: string): Integer;
var
  F: TextFile;
begin
  AssignFile(F,NomArch);
  Reset(F);
  Result:= 0;
  while not Eof(F) do
  begin
    Readln(F);
    Inc(Result);
  end;
  CloseFile(F);
end;

procedure TForm1.ProcessFile(NomArch: string);
var
  F: TextFile;
  s: string;
begin
  AssignFile(F,NomArch);
  Reset(F);
  while not Eof(F) do
  begin
    ReadLn(F, s);
    (* Aca las operaciones que realices. Para el ejemplo muestra en Memo *)
    Memo1.Lines.Add(s);  
    ProgressBar1.StepIt; // Avanza Step posiciones en el ProgressBar
    // Application.ProcessMessages; (* de ser necesario *)
  end;
  CloseFile(F);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ProgressBar1.Max:= NumFileLines('C:\ARCHIVO.TXT');
  ProgressBar1.Step:= 1;
  ProcessFile('C:\ARCHIVO.TXT');
end;
...


Saludos.

ecfisa 24-05-2011 13:17:36

Hola de nuevo.

Se me cruzó una idea para usar FileSize. Un archivo de texto puede ser tomado como un archivo tipado cuyos registros sean de un caracter, es decir
de tipo file of char.

Código Delphi [-]
...
procedure TForm1.ProcessFile(NomArch: string);
var
  F: file of char;
  ch: char;
  s: string;
begin
  AssignFile(F,NomArch);
  Reset(F);
  ProgressBar1.Max:= FileSize(F);
  s:= '';
  while not Eof(F) do
  begin
    Read(F,ch);
    if ch = #13 then
    begin
      (* Aca las operaciones que realices. *)
      Form1.Memo1.Lines.Add(s);
      ProgressBar1.StepBy(Length(s)+2); // Avanza largo de línea en el ProgressBar
      // Application.ProcessMessages; // si lo necesitas
      s:= '';
    end
    else
      s:= s + ch;
  end;
  CloseFile(F);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ProcessFile('C:\DATOS.txt');
end;
Pero el progreso de la barra es mas parejo en el ejemplo anterior.

Saludos.

oscarac 24-05-2011 15:42:07

buenos dias....
ya mas repuesto con 4 horitas de sueño conciliador....
creo que optare por la primera opcion, la de contar el numero de Lineas.... como no son muchos los registros, el modulo lo hara rapido...
gracias ecfisa

maeyanes 24-05-2011 18:46:26

Hola...

Si estás leyendo desde un archivo de texto, ¿por qué no usar la clase TStringList?

Código Delphi [-]
begin
  with TStringList.Create do
    try
      LoadFromFile('Archivo.txt');
      ProgressBar.Max := Count;
      ProgressBar.Position := 0;
      for I := 0 to Pred(Count) do
      begin
        // Procesamos las lineas de texto...
        ProgressBar.StepIt
      end
    finally
      Free
    end
end;


Saludos...

ecfisa 24-05-2011 20:00:44

Cita:

Empezado por maeyanes (Mensaje 401149)
Si estás leyendo desde un archivo de texto, ¿por qué no usar la clase TStringList?

Siendo que de esa forma se genera un código mas corto, mas simple y mas elegante, la verdad... no se me ocurre por que... :rolleyes: :D

Cuando veo un file o un FileSize, me aflora el pascalero. Ganas de complicarse la vida que tiene uno nomás...:)

Saludos.

oscarac 24-05-2011 20:05:05

yyyyy pues......
uno saca el modelo de los ejemplos que se encuentran en la web:):cool:

ecfisa 24-05-2011 20:08:06

Cita:

Empezado por oscarac (Mensaje 401171)
yyyyy pues......
uno saca el modelo de los ejemplos que se encuentran en la web:):cool:

Ojalá hubiera sido así en mi caso... Le podría echar las culpas a otro !!! :D:D:D

Saludos.


La franja horaria es GMT +2. Ahora son las 19:40:15.

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