Delphi 为什么即使文件不是';你不能在其他程序中打开吗?

Delphi 为什么即使文件不是';你不能在其他程序中打开吗?,delphi,text-files,ioerror,Delphi,Text Files,Ioerror,我试图用下面的代码在Delphi 7中为文本文件写一行代码,但它给出了以下错误: “引发了异常类EINOURROR,带有'I/O错误32'” 它没有被任何其他应用程序使用,但仍然给出错误32 (还需要它来覆盖文本文件中的当前内容)。这是一个关于如何编写简单文本文件的简单示例 例子的来源是—— 代码: 如果文件被另一个进程锁定,或者已经被当前进程锁定(如Remy Lebeau所指出的),则会出现如下所述的错误 32共享冲突 这意味着另一个进程正在使用该文件,在该进程使用同一文件完成之前,您无法保存

我试图用下面的代码在Delphi 7中为文本文件写一行代码,但它给出了以下错误:

“引发了异常类EINOURROR,带有'I/O错误32'”

它没有被任何其他应用程序使用,但仍然给出错误32


(还需要它来覆盖文本文件中的当前内容)。

这是一个关于如何编写简单文本文件的简单示例

例子的来源是——

代码:

如果文件被另一个进程锁定,或者已经被当前进程锁定(如Remy Lebeau所指出的),则会出现如下所述的错误

32共享冲突

这意味着另一个进程正在使用该文件,在该进程使用同一文件完成之前,您无法保存更改

以下代码取自此网站,说明如何验证文件是否已在使用中:

function IsFileInUse(FileName: TFileName): Boolean;
var
  HFileRes: HFILE;
begin
  Result := False;
  if not FileExists(FileName) then Exit;
  HFileRes := CreateFile(PChar(FileName),
                         GENERIC_READ or GENERIC_WRITE,
                         0,
                         nil,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then
    CloseHandle(HFileRes);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsFileInUse('c:\Programs\delphi6\bin\delphi32.exe') then //here you need to change this with the path to the file you want to edit/write/etc
    ShowMessage('File is in use.');
  else
    ShowMessage('File not in use.');
end;

这是一个关于如何编写简单文本文件的简单示例

例子的来源是——

代码:

如果文件被另一个进程锁定,或者已经被当前进程锁定(如Remy Lebeau所指出的),则会出现如下所述的错误

32共享冲突

这意味着另一个进程正在使用该文件,在该进程使用同一文件完成之前,您无法保存更改

以下代码取自此网站,说明如何验证文件是否已在使用中:

function IsFileInUse(FileName: TFileName): Boolean;
var
  HFileRes: HFILE;
begin
  Result := False;
  if not FileExists(FileName) then Exit;
  HFileRes := CreateFile(PChar(FileName),
                         GENERIC_READ or GENERIC_WRITE,
                         0,
                         nil,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then
    CloseHandle(HFileRes);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsFileInUse('c:\Programs\delphi6\bin\delphi32.exe') then //here you need to change this with the path to the file you want to edit/write/etc
    ShowMessage('File is in use.');
  else
    ShowMessage('File not in use.');
end;

问题中的代码将用文本“left::”替换文件中的所有内容。代码的这一部分很好

I/O错误32是共享冲突。文件被锁定的方式会阻止代码写入该文件。另一个进程,甚至您自己的进程都对文件有一个锁。系统没有说谎。文件已在某个位置打开,这就是代码失败并出现错误32的原因


我认为你自己的程序很可能是有罪的一方。查看代码中打开该文件的所有位置。您是否有两个或更多附加到该文件的文件变量?您是否100%确定在使用另一个变量打开文件时,您从未使用一个文件变量打开该文件?

问题中的代码将用文本“left::”替换文件中的所有内容。代码的这一部分很好

I/O错误32是共享冲突。文件被锁定的方式会阻止代码写入该文件。另一个进程,甚至您自己的进程都对文件有一个锁。系统没有说谎。文件已在某个位置打开,这就是代码失败并出现错误32的原因


我认为你自己的程序很可能是有罪的一方。查看代码中打开该文件的所有位置。您是否有两个或更多附加到该文件的文件变量?您是否100%确定您从未使用一个文件变量打开文件,而该文件已使用另一个变量打开?

这在许多不同的网站上被多次解释。我所看到的所有网站都说使用WriteLn,这对我不起作用。如果我没有尝试在其他地方找到答案,我不会问任何问题。错误代码32表示:“该进程无法访问该文件,因为它正被另一个进程使用。”好吧,显然是其他东西锁定了该文件。很可能这段代码所处的过程是相同的。您很容易看到问题中的代码运行良好。只需将代码放入一个空程序中,并观察它是否工作。因此,问题在于你没有展示的代码。始终提供一个完整的程序来说明问题。如果你曾经尝试过这样做,你会自己解决这个问题。你是如何确认没有其他应用程序在使用它的?您是否使用了一些工具,如Process Monitor?那么试着写另一个全新的文本文件怎么样?这在很多不同的网站上被解释了很多次。我见过的所有网站都说使用WriteLn,这对我来说不起作用。如果我没有尝试在其他地方找到答案,我不会问任何问题。错误代码32表示:“该进程无法访问该文件,因为它正被另一个进程使用。”好吧,显然是其他东西锁定了该文件。很可能这段代码所处的过程是相同的。您很容易看到问题中的代码运行良好。只需将代码放入一个空程序中,并观察它是否工作。因此,问题在于你没有展示的代码。始终提供一个完整的程序来说明问题。如果你曾经尝试过这样做,你会自己解决这个问题。你是如何确认没有其他应用程序在使用它的?您是否使用了一些工具,如Process Monitor?那么,尝试写入另一个全新的文本文件如何?仅供参考,如果在每次打开之间多次以冲突的访问位打开文件,而不关闭文件,则在同一进程中也可能发生共享冲突。@RemyLebeau-正确。我将修改答案以包含此内容。仅供参考,如果在每次打开之间多次打开文件并使用冲突的访问位,而不关闭文件,则在同一进程中也可能发生共享冲突。@RemyLebeau-更正。我将修改答案,以包括这一点。
function IsFileInUse(FileName: TFileName): Boolean;
var
  HFileRes: HFILE;
begin
  Result := False;
  if not FileExists(FileName) then Exit;
  HFileRes := CreateFile(PChar(FileName),
                         GENERIC_READ or GENERIC_WRITE,
                         0,
                         nil,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then
    CloseHandle(HFileRes);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsFileInUse('c:\Programs\delphi6\bin\delphi32.exe') then //here you need to change this with the path to the file you want to edit/write/etc
    ShowMessage('File is in use.');
  else
    ShowMessage('File not in use.');
end;