如何规避文件未找到错误?

时间:2010-11-09 14:43:32

标签: delphi

有时在运行中遇到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所在的实际当前目录?可能不是这样。

3 个答案:

答案 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()?确保从实际目录中打开文件。如何做到这一点取决于文件的生成方式和时间。当然,设置一些错误控制来处理错误是可以的,但如果你希望找到这样一个不应该发生但在“特殊”情况下的文件。