我收到错误:
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;
有人可以帮助我吗?
答案 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
将失败。
编译(但尚未运行)下面的控制台应用程序。
将生成的exe复制到同一目录中的文件中,但扩展名为“.BU”而非“.EXE”的是,在EXE上尝试Reset
将导致{{ 1}},表示“拒绝访问”,因为当操作系统打开EXE时,它不会以可共享模式打开。
现在运行该应用。它应该正确报告.BU文件的大小。
假设EXE按预期工作,您需要确定错误的来源。我的第一个猜测是RunError(5)
的实例不是系统单元中的实例 - 我的代码调用FileSize
以确保调用正确的FileSize实例。您可以通过将代码更改为System.FileSize
来检查 - 如果错误消失,您就找到了原因。
代码:
TotalBytes := System.FileSize(...