Perché ricevo errore di I/O a 32, anche se il file non si apre in qualsiasi altro programma?

Sto cercando di scrivere una riga di un file di testo in Delphi 7, con il seguente codice, ma ha dato questo errore:

“Ha generato l’Eccezione della Classe EInOutError con “errore di I/O a 32′”

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

Non è stato usato da un’altra applicazione, ma si dà ancora errore 32.

(Anche bisogno di sovrascrivere il contenuto del file di testo).

  • È necessario chiarire che cosa si sta cercando. Solo dicendo Write() o WriteLn() non ci dice che cosa stai veramente cercando di fare. Si prega di includere tutte relativo codice. Ma il codice di errore 32 mi dice che il file che si sta tentando di scrivere è già aperto in un altro processo.
  • La questione è abbastanza semplice. Voglio solo sapere come scrivere 1 riga di testo di un .file txt.
  • Che è spiegato molte, molte volte in molti, molti siti web differenti.
  • Tutti i siti web che ho visto dicono di usare WriteLn, che non funziona per me. Non vorrei fare una domanda se non avessi già cercato di trovare la risposta da qualche altra parte.
  • Codice di errore 32 significa: “Il processo non può accedere al file perché è utilizzato da un altro processo.”
  • Beh, WriteLn non funziona. Si fa quello che si suppone di fare. Non è stato fornito alcun codice, o spiegare veramente cosa si sta cercando di fare. Cosa significa sovrascrivere la riga corrente significa davvero?
  • Significa sovrascrivere l’attuale linea di testo in un file txt. Ho chiuso tutti i programmi che utilizzano i file txt ma ora ha dato errore 105.
  • Scusa, effettivamente dà ancora errore di codice a 32.
  • I file di testo non hanno una “corrente di linea”. Le tue domande non rende il senso reale. Se si desidera inserire un/sovrascrivere il testo all’interno di un file, è probabilmente impossibile. Possibile solo se si sta scrivendo lo stesso numero di caratteri, come c’era prima.
  • Aggiornato domanda con l’attuale codice che sto utilizzando.
  • Beh, chiaramente qualcosa che ha bloccato il file. Molto probabilmente è il processo stesso che questo codice lo abita. E ‘ facile per voi per vedere che il codice in questione funziona bene. Basta mettere il codice in un programma vuoto e osservare che funziona. Ergo, il problema è nel codice non si mostrano. Sempre sempre fornire un programma completo che illustra il problema. Se tu avessi provato a fare quello che lei avrebbe risolto il problema.
  • che mi ricorda: stackoverflow.com/questions/13736707/…
  • Come hai fatto a verificare che nessun altra applicazione sta usando? Non è possibile utilizzare alcuni strumenti come il Monitor di Processo? E come cercare di scrivere un altro nuovo di zecca file di testo?
  • Davvero? Io postare un link a una domanda e si arriva fino-votati?

InformationsquelleAutor Penian4 | 2013-04-29

 

3 Replies
  1. 3

    questo è un semplice esempio su come scrivere un semplice file di testo

    fonte di esempio – http://www.delphibasics.co.uk/RTL.asp?Name=TextFile

    codice:

    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;

    se il file è bloccato da un altro processo o già bloccato per il processo corrente(come Remy Lebeau sottolineato), si ottiene un errore come descritto qui http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_EInOutError.html

    32 violazione di Condivisione

    che significa che un altro processo sta utilizzando il file, e non è possibile salvare le modifiche fino a che il processo è fatto utilizzando lo stesso file.

    il seguente codice preso da questo sito http://www.swissdelphicenter.ch/torry/showcode.php?id=104 illustrato come verificare se un file è già in uso:

    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;
    • Cordiali saluti, una violazione di condivisione può verificarsi anche all’interno dello stesso processo, se si apre il file più volte in conflitto con accesso bit senza chiudere il file tra le open.
    • Corretto. Modificherò la risposta di includere anche questo.
  2. 2

    Il codice in questione andrà a sostituire tutto il contenuto del file con il testo a sinistra::’. Che parte del codice va bene.

    Errore di I/O 32 è una violazione di condivisione. Il file è bloccato in un modo che impedisce il codice di scrittura per il file. Sia un altro processo, o anche il proprio processo ha un blocco su file. Il sistema non si trovano. Il file è già aperto da qualche parte che è il motivo per cui il codice non riuscita con errore 32.

    Penso che sia più probabile che il vostro programma è il colpevole. Guarda tutti i punti del codice in cui si apre il file. Avete due o più variabili di file che sono collegati a quel file? Siete sicuri al 100% che non avete mai aprire il file con un file variabile, mentre è già aperto con un’altra variabile?

  3. -2

    Si può chiudere errore che indica con {$I- } e può aprire con {$I+} di nuovo.

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

    con questo non si vedrà errore di I/O ed è possibile utilizzare il file in pace.

    Per ulteriori dettagli si può controllare qui.

    • Io non capire, questa non è una soluzione. Questo è solo per ignorare I/O errori. Come puoi pretendere che un processo di “utilizzare il file in pace” quando Windows non permette? Se non altro, questo è rendere le cose ancora peggio, c’è ancora un errore, ma ora che non si può vedere.
    • perché abbiamo questa proprietà in Delphi, allora? Il resto è solo un file di testo. Personalmente usato in un programma per la stessa cosa come questa situazione e non ha mai avuto alcun problema. E salvato tonnellate di nuove linee di codice nel mio programma. In realtà la sua non è ignorando di errore, semplicemente non lasciare che il controllo di windows è un file aperti o meno.
    • Quindi mi stai dicendo è possibile forzare Windows per scrivere un file è bloccato da un altro processo?
    • Questo è come il bambino che copre i suoi occhi, nella convinzione che così facendo nessuno altro può vedere. “Se io sopprimere la segnalazione di errore, quindi l’errore non è successo”!!

Lascia un commento