Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ayuda con TFileStream (https://www.clubdelphi.com/foros/showthread.php?t=43547)

JF Sebastian 14-05-2007 21:28:04

Ayuda con TFileStream
 
Estimados foreros:
Tengo el problema de crear un archivo de mas de 2GB de tamaño y debo emplear la rutina seek. El problema es que por defecto esta rutina no sirve para estos tamaños de archivo por lo que he decidido probar con TFileStream.

Se trata de usar TFileStream en lugar de lo siguiente. Unas lineas de codigo por vuestra parte me iria de perlas.

Código Delphi [-]
const 
  max = 1024*1024;
type 
  TArr = array [1..max] of double;
var 
  buf:TArr;
  F: File of TArr;
 
procedure CreaArchivo;
var i: integer;
begin
  AssignFile(F,'C:\1.tmp');
  rewrite(F);
  for i := 1 to 1024 do write(F,buf);
  closefile(F);
end;
 
procedure Busca(pos: Integer);
begin
  AssignFile(F,'C:\1.tmp');
  reset(F);
  Seek(F,Pos);  /// <---  Error
  read(F,buf);
  closefile(F);
end;

Muchas gracias

roman 14-05-2007 21:46:16

¿No te sirve algo así?

Código Delphi [-]
var
  Stream: TFileStream;

begin
  Stream := TFileStream.Create('CalendarCombo.dcu', fmOpenRead);

  try
    Stream.Seek(Pos, soBeginning);
    Stream.ReadBuffer(Buf, SizeOf(Buf));
  finally
    Stream.Free;
  end;
end;

// Saludos

JF Sebastian 14-05-2007 22:10:48

He intentado hacer un ejemplo de lectura escritura empleando seek pero solo me lee ceros. Ignoro por que.


Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
const max = 1024*1024;
type
  TArr=array[1..max] of double;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  buf:Tarr;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var  Stream: TFileStream; pos: integer;
begin
  Stream := TFileStream.Create('c:\1.tmp', fmOpenReadWrite);
  try
    for pos := 0 to 512 do
    begin
      Stream.Seek(Pos, soBeginning);
      Stream.ReadBuffer(Buf, SizeOf(Buf));
      Button1.Caption := IntToStr(Trunc(Buf[1]));
      Application.ProcessMessages;
      Stream.Seek(Pos, soBeginning);
      Stream.WriteBuffer(Buf, SizeOf(Buf));
    end;
  finally
    Stream.Free;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var  Stream: TFileStream; pos,i: integer;
begin
  Stream := TFileStream.Create('c:\1.tmp', fmCreate);
  try
    for pos := 0 to 512 do
    begin
      fillchar(Buf,sizeof(buf),0);
      for i := 1 to max do Buf[i] := pos;
      Stream.WriteBuffer(Buf, SizeOf(Buf));
      Button2.Caption := IntToStr(Trunc(Buf[1]));
      Application.ProcessMessages;
    end;
  finally
    Stream.Free;
  end;
end;
end.


La franja horaria es GMT +2. Ahora son las 23:40:06.

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