Lazarus FileSize错误

问题描述 投票:-3回答:2

我收到一个错误:

unit1.pas(91,31)错误:arg no的类型不兼容。 1:得到“Byte文件”,预计“AnsiString”

我的代码:

var
    f : file of byte; 

...

AssignFile(f, FileName);
Reset(f);
try
  TotalBytes := FileSize(f); // line 93
finally
  CloseFile(f);
end;  

有人能帮我吗?

filesize lazarus
2个回答
1
投票

正如@Abelisto所说,在拉撒路有两个函数FileSize,一个在System单位,一个在Lazarus单位fileutil

前者采用File作为参数,而后者采用string

因此,如果您的代码在fileutil子句中包含uses,那么该单元中的那个优先于System中的那个。这解释了错误消息。

你将不得不完全限定调用,所以使用FileSize(f)代替普通的System.FileSize(f),或者使用FileSize(FileName)fileutil.FileSize(FileName)


0
投票

第91行似乎是

Reset(f);

因此,不清楚为什么要包含关于第93行的评论。

但是,如果你在Reset(f)上收到错误,原因必须是你在q中没有告诉我们的。要了解原因,请仔细按照以下步骤操作。

注意:在我的代码中将FileSize调用基于编译的EXE副本的原因是为了保证文件存在但不是EXE本身,因为当EXE运行时它不能以可共享模式打开,所以试图在它上面调用Reset会失败。

  1. 编译(但不要运行)下面的控制台应用程序。
  2. 将生成的exe复制到同一目录中的文件,但扩展名为'.BU'而不是'.EXE',在EXE上尝试Reset将导致RunError(5),这意味着“拒绝访问”,因为当操作系统打开EXE,不以可共享模式打开。
  3. 现在运行应用程序。它应该正确报告.BU文件的大小。
  4. 假设EXE按预期工作,您需要确定错误的来源。我的第一个猜测是FileSize的实例不是系统单元中的实例 - 我的代码调用System.FileSize以确保调用FileSize的正确实例。您可以通过将代码更改为TotalBytes := System.FileSize(...来检查 - 如果错误消失,您就找到了原因。

码:

program Files2;

{$mode objfpc}{$H+}

uses
  SysUtils;

var
  TotalBytes : Int64;
  f : file of byte;
  FileName : String;
begin
  FileName := ChangeFileExt(ParamStr(0), '.BU'); // get name of this app
  AssignFile(f, FileName);
  Reset(f);
  try
    TotalBytes := System.FileSize(f);
    writeln('Size of ', FileName, ' = ', TotalBytes, ' bytes');
    readln;
  finally
    CloseFile(f);
  end;
end.
© www.soinside.com 2019 - 2024. All rights reserved.