2013-04-29 326 views
0

我试图写一行与下面的代码在Delphi 7的文本文件,但它给了这个错误:即使该文件未在其他程序中打开,为什么会出现I/O错误32?

“引发的异常类EInOutError与‘I/O错误32’”

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

它不被任何其他应用程序,但它仍然给错误32.

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

+0

你需要澄清你在尝试什么。只是说'Write()'或'WriteLn()'并不能告诉我们你真的想要做什么。请包括所有相关的代码。但是,错误代码32告诉我您正在尝试写入的文件已在另一个进程中打开。 – 2013-04-29 20:55:50

+0

这个问题很简单。我只想知道如何将1行文本写入.txt文件。 – Penian4 2013-04-29 20:57:33

+1

这在很多很多不同的网站上都有很多次的解释。 – 2013-04-29 20:58:14

回答

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 Sharing violation

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

从本网站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; 
+5

仅供参考,如果共享冲突在同一进程中发生多次,并且冲突的访问位不会在每次打开之间关闭文件时都会发生共享冲突。 – 2013-04-29 23:23:03

+0

@RemyLebeau - 正确。我会修改答案来包含这一点。 – RBA 2013-04-30 06:19:40

2

在你的问题将替换文本文件中的所有内容的代码“左: :”。你的代码部分没问题。

I/O错误32是共享违规。该文件被锁定的方式会阻止您的代码写入文件。另一个进程,或者甚至你自己的进程都会对该文件产生锁定。该系统不撒谎。该文件已经打开某处这就是为什么你的代码失败,错误32.

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

-2

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

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

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

欲了解更多详情you can check here

+0

我不理解,这不是一个解决方案。这只是为了忽略I/O错误。当Windows不允许你时,你如何期望一个进程“安全地使用你的文件”?如果有的话,这会让事情变得更糟 - 仍然存在错误,但现在你看不到它了。 – 2013-04-30 19:54:46

+0

为什么我们在Delphi中拥有这个属性呢?其他方式,它只有一个文本文件。 Personaly在一个程序中使用了这样的事情,就像这种情况一样,从来没有任何问题。并在我的程序中保存了大量新代码。实际上它不忽略错误,只是不让Windows检查文件打开或不打开。 – signon 2013-04-30 20:49:15

+0

所以你告诉我可以强制Windows写入一个被另一个进程锁定的文件? – 2013-04-30 21:11:31

相关问题