为什么即使文件未在任何其他程序中打开,我也会收到I / O错误32?

时间:2013-04-29 20:49:34

标签: delphi text-files ioerror

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

“引发异常类EInOutError且'I / O错误32'”

AssignFile(trackertxt, 'tracker.txt');
ReWrite(trackertxt);
WriteLn(trackertxt, 'left'+':'+':');
CloseFile(trackertxt);

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

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

3 个答案:

答案 0 :(得分:3)

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

示例来源是 - http://www.delphibasics.co.uk/RTL.asp?Name=TextFile

代码:

var
  myFile : TextFile;
  text   : string;

begin
  // Try to open the Test.txt file for writing to
  AssignFile(myFile, 'Test.txt');
  ReWrite(myFile);

  // Write a couple of well known words to this file
  WriteLn(myFile, 'Hello World');

  // Close the file
  CloseFile(myFile);

  // Reopen the file for reading
  Reset(myFile);

  // Display the file contents
  while not Eof(myFile) do
  begin
    ReadLn(myFile, text);
    ShowMessage(text);
  end;

  // Close the file for the last time
  CloseFile(myFile);
end;

如果文件被另一个进程锁定,或者已经被当前进程锁定(正如Remy Lebeau指出的那样),那么您将收到如此处所述的错误http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_EInOutError.html

  

32分享违规行为

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

以下来自此网站的代码http://www.swissdelphicenter.ch/torry/showcode.php?id=104向您展示了如何验证文件是否已被使用:

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;

答案 1 :(得分:2)

您问题中的代码将使用文本'left ::'替换文件中的所有内容。那段代码很好。

I / O错误32是共享冲突。文件被锁定的方式会阻止您的代码写入文件。另一个进程,甚至您自己的进程都锁定了该文件。系统不撒谎。该文件已在某处打开,这就是您的代码因错误32而失败的原因。

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

答案 2 :(得分:-2)

您可以关闭{$ I-}显示的错误,并可以再次使用{$ I +}打开它。

{$I-}
//your code here
{$I+}

有了这个,你就不会看到I / O错误了,你可以安心地使用你的文件。

有关详情you can check here