delphi - error de lectura de bloque
delphi-unicode (2)
¿Alguien puede explicarme por qué estoy golpeando el ''error de E / S 998'' en la lectura de bloque siguiente?
function ReadBiggerFile: string;
var
biggerfile: file of char;
BufArray: array [1 .. 4096] of char; // we will read 4 KB at a time
nrcit, i: integer;
sir, path: string;
begin
path := ExtractFilePath(application.exename);
assignfile(biggerfile, path + ''asd.txt'');
reset(biggerfile);
repeat
blockread(biggerfile, BufArray, SizeOf(BufArray), nrcit);
for i := 1 to nrcit do
begin
sir := sir + BufArray[i];
Form4.Memo1.Lines.Add(sir);
end;
until (nrcit = 0);
closefile(biggerfile);
ReadBiggerFile := sir;
end;
Creo que echaste de menos la pregunta y estás usando Delphi 2009+, no Delphi 7. Obtuve el error en la barra de título probando tu código exacto en Delphi 2010 (Delphi unicode). Cuando tu dices:
var biggerfile: file of Char;
Estás declarando que el biggerfile
es un archivo de "registros", donde cada registro es un Char
. En Unicode Delphi eso es 2 bytes. Más adelante solicita leer SizeOf(BufArray)
, no bytes. Es decir, solicita 4096 x 2 = 8192 registros . Pero tu memoria intermedia tiene solo 4096 registros, por lo que obtienes un error extraño.
Pude reparar tu código simplemente reemplazando Char
con AnsiChar
, ya que AnsiChar
tiene un tamaño de 1
, por lo tanto, SizeOf()
es igual a Length()
.
La solución permanente debería implicar pasar de las antiguas operaciones de file
estilo Pascal a algo moderno, basado en TStream
. No estoy seguro exactamente de lo que está tratando de obtener, pero si simplemente desea obtener el contenido del archivo en una cadena, le sugiero algo como esto:
function ReadBiggerFile: AnsiString;
var
biggerfile: TFileStream;
begin
biggerfile := TFileStream.Create(''C:/Users/Cosmin Prund/Downloads/AppWaveInstall201_385.exe'', fmOpenRead or fmShareDenyWrite);
try
SetLength(Result, biggerfile.Size);
biggerfile.Read(Result[1], biggerfile.Size);
finally biggerfile.Free;
end;
end;
Hola: tuve el mismo problema y simplemente le pasé el primer elemento del buffer que es el punto de partida para el bloque de memoria así:
AssignFile(BinFile,binFileName);
reset(BinFile,sizeof(Double));
Aux:=length(numberArray);
blockread(BinFile,numberArray[0],Aux, numRead);
closefile(BinFile);