阻止读取错误

时间:2012-02-29 04:16:59

标签: delphi delphi-unicode

有人可以解释一下为什么我在下面的块读取中遇到'I / O错误998'?

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;

2 个答案:

答案 0 :(得分:5)

我认为你错过了标记问题并且你正在使用Delphi 2009+,而不是Delphi 7.我在标题栏中遇到了错误,在Delphi 2010上尝试了你的确切代码(unicode Delphi)。当你说:

var biggerfile: file of Char;

您宣布biggerfile是“记录”文件,其中每条记录都是Char。在Unicode Delphi上,这是2个字节。您之后请求阅读SizeOf(BufArray) 记录,而不是字节。也就是说,您要求4096 x 2 = 8192 记录。但是你的缓冲区只有4096条记录,所以你得到一个奇怪的错误。

我只需将Char替换为AnsiChar即可修复您的代码,因为AnsiChar的大小为1,因此SizeOf()等于Length()

永久修复应该涉及从非常古老的Pascal式file操作转移到基于TStream的现代操作。我不确定你想要获得什么,但如果你只是想用字符串获取文件的内容,我可以建议这样的事情:

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;

答案 1 :(得分:3)

嗨:我有同样的问题,我只是将缓冲区的第一个元素传递给内存块的起点,如下所示:

    AssignFile(BinFile,binFileName);
    reset(BinFile,sizeof(Double));
    Aux:=length(numberArray);
    blockread(BinFile,numberArray[0],Aux, numRead);
    closefile(BinFile);