PDA

Ver la Versión Completa : Ayuda con TFileStream


JF Sebastian
14-05-2007, 21:28:04
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.


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í?


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.



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.