0

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

“引发异常类 EInOutError 并带有 'I/O 错误 32'”

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

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

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

4

2 回答 2

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;
于 2013-04-29T21:04:01.083 回答
2

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

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

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

于 2013-04-30T06:38:06.333 回答