我收到一个错误:
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;
有人能帮我吗?
正如@Abelisto所说,在拉撒路有两个函数FileSize
,一个在System
单位,一个在Lazarus单位fileutil
。
前者采用File
作为参数,而后者采用string
。
因此,如果您的代码在fileutil
子句中包含uses
,那么该单元中的那个优先于System
中的那个。这解释了错误消息。
你将不得不完全限定调用,所以使用FileSize(f)
代替普通的System.FileSize(f)
,或者使用FileSize(FileName)
或fileutil.FileSize(FileName)
。
第91行似乎是
Reset(f);
因此,不清楚为什么要包含关于第93行的评论。
但是,如果你在Reset(f)
上收到错误,原因必须是你在q中没有告诉我们的。要了解原因,请仔细按照以下步骤操作。
注意:在我的代码中将FileSize
调用基于编译的EXE副本的原因是为了保证文件存在但不是EXE本身,因为当EXE运行时它不能以可共享模式打开,所以试图在它上面调用Reset
会失败。
Reset
将导致RunError(5)
,这意味着“拒绝访问”,因为当操作系统打开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.