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

Delphi 如何规避文件未找到错误?,delphi,Delphi,有时在运行中遇到文件未找到错误是很奇怪的。但我们不知道如何绕过这个错误。有一句话: AHash := THash.Create(); assign(F,Getcurrentdir+'\data.txt'); reset(F);//File not Found while not EOF(F) do ... 这种错误并不总是如此。有时会提示错误,有时工作正常。 我们不知道为什么以及如何修复它。 事先非常感谢 或者在分配文件之前是否有更新当前目录的功能。这样行吗 data.tx

有时在运行中遇到文件未找到错误是很奇怪的。但我们不知道如何绕过这个错误。有一句话:

  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所在的实际当前目录?可能不是这样。

您可以使用FileExistsfilename函数检查文件是否存在。它位于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;
你可以用这个:

{$I-}
assign(F,Getcurrentdir+'\data.txt');
reset(F);
if (ioResult=0) then begin
  while not EOF(F) do
  ...
{$I+}

$I指令关闭自动错误检查,因此您必须使用ioResult检查自己代码中的错误。如果启用,则IO错误将导致异常。请注意:您需要在每个重置/读/写语句中检查ioResult。该文件可能存在,但由于用户没有访问权限,仍然不可用。

GetCurrentDir可能并不总是返回您需要的目录-当前目录可能已更改。如果您试图打开的文件不存在,为什么首先要使用GetCurrentDir?确保从实际目录打开文件。如何做到这一点取决于生成文件的方式和时间。当然,设置一些错误控制来处理错误是可以的,但是如果您希望找到这样一个文件,那么这种情况不应该发生,而是在特殊情况下。

我们是否必须使用该文件存在函数,该文件在目录中。但有时它仍然会提示错误,情况并非总是如此。我的意思是有时会发生,有时还可以。+1 by…,但最好能找到文件不在那里的真正原因,因为它应该在那里。谢谢你,RRUZ,似乎其他应用程序正在运行,情况相对更严重,我们仍在检查。谢谢。使用FileExists有一个警告-在“FileExists”调用和任何加载/读取尝试之间,文件可能会被删除或变得不可用,因此即使您检查文件是否存在,也要始终捕获“not found”异常,以防万一。您如何知道当前目录不是@user482742需要的目录?我有很多程序可以处理当前目录下的文件,GetCurrentDir在这种情况下总是准确返回我需要的目录。因为如果他没有找到应该在那里的文件,这意味着当前目录可能已被更改。它可以改变。他问在分配文件SetCurrentDirectory之前是否有更新当前目录的方法,顺便说一句。如果它对你有用,但那是他的应用程序,不是你的。你怎么知道当前目录是他需要的?还有什么更好?绕过一个错误,或者尝试理解程序实际试图做什么,并修复它的真正原因?有可能是一个行为不好的组件正在破坏当前目录,Raymond Chen刚刚在博客中提到了一个类似的问题,这里+1表示原因可能是当前目录的更改。是的,旧但仍然非常有效:如果我没有弄错的话,我已经在1988年将这个指令用于旧的Turbo Pascal。我只是承认我也老了吗?我的建议是确保文件存在。