有时在运行中遇到File not Found Error很奇怪。但我们不知道如何绕过错误。有一条线:
AHash := THash.Create();
assign(F,Getcurrentdir+'\data.txt');
reset(F);//File not Found
while not EOF(F) do
...
此(错误)并非总是如此。有时它会提示错误,有时候效果很好。 我们不知道为什么以及如何解决它。 非常感谢你提前。
或者是否有在分配文件之前更新当前目录的功能。这有用吗?
data.txt是打包并安装到用户端的资源,永久驻留在application.exe目录中。当我们的程序运行时,Getcurrentdir函数是否会更改data.txt所在的实际当前目录?可能不是这样。
答案 0 :(得分:3)
您可以使用FileExists
(文件名)功能检查文件是否存在。它位于sysutils.pas
。
如果您认为找不到文件错误不正确,可能您没有足够的权限来使用该文件。或者文件可能不在您期望的位置。
如果您认为文件有时“由于超出人类理解的神奇原因而未找到”,您可以使用以下功能。但是,当它应该存在时,最好找到文件不存在的真正原因。
function TryOpenFile(const AFileName: string; const AMaxTries: Integer; var AFile: File): Boolean;
var
tries : Integer;
begin
tries := 0;
Result := false;
while not Result and (tries<=AMaxTries) do begin
try
assign(AFile,AFileName);
reset(AFile);
Result := True;
except
on e: EFileNotFoundException do begin
Inc(tries);
// Add delay if you wish.
end;
end;
end;
end;
答案 1 :(得分:3)
你可以用这个:
{$I-}
assign(F,Getcurrentdir+'\data.txt');
reset(F);
if (ioResult=0) then begin
while not EOF(F) do
...
{$I+}
$ I指令关闭自动错误检查,因此您必须使用ioResult检查自己代码中的错误。如果打开,则IO错误将导致异常。
请注意:您需要检查每个重置/读/写语句的ioResult。
文件可能存在,但仍然不存在因为用户没有访问权限,所以可以使用。
答案 2 :(得分:1)
GetCurrentDir()可能无法始终返回您需要的目录 - “当前”目录可能已更改。如果您尝试打开的文件不存在,为什么首先使用GetCurrentDir()?确保从实际目录中打开文件。如何做到这一点取决于文件的生成方式和时间。当然,设置一些错误控制来处理错误是可以的,但如果你希望找到这样一个不应该发生但在“特殊”情况下的文件。