Lazarus FileSize错误

时间:2017-12-28 09:50:20

标签: filesize lazarus

我收到错误:

  

unit1.pas(91,31)错误:arg no的类型不兼容。 1:得到"字节文件",预期" AnsiString"

我的代码:

var
    f : file of byte; 

...

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

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

您必须完全限定通话,因此请使用FileSize(f)代替普通System.FileSize(f),或者使用FileSize(FileName)fileutil.FileSize(FileName)

答案 1 :(得分:0)

第91行似乎是

Reset(f);

所以不清楚为什么要包含关于第9行 3 的评论。

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

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

  1. 编译(但尚未运行)下面的控制台应用程序。

  2. 将生成的exe复制到同一目录中的文件中,但扩展名为“.BU”而非“.EXE”的是,在EXE上尝试Reset将导致{{ 1}},表示“拒绝访问”,因为当操作系统打开EXE时,它不会以可共享模式打开。

  3. 现在运行该应用。它应该正确报告.BU文件的大小。

  4. 假设EXE按预期工作,您需要确定错误的来源。我的第一个猜测是RunError(5)的实例不是系统单元中的实例 - 我的代码调用FileSize以确保调用正确的FileSize实例。您可以通过将代码更改为System.FileSize来检查 - 如果错误消失,您就找到了原因。

  5. 代码:

    TotalBytes := System.FileSize(...