Newsgroup: it.comp.lang.visual-basic
Titolo: Istruzione kill

Salve a tutti
Ho un problema in una routine.
Devo convertire un file da un formato in un altro creando ne frattempo
un file temporaneo.
Dopo aver convertito, cancello l'originale con KILL e copio il file
convertito rinominandolo con lo stesso nome del file cancellato.
Il problema è che molte volte, il file che avrei dovuto cancellare in
effetti non lo è, in quanto, l'istruzione name file_temporaneo as
file_originale, a volte mi ritorna l'errore 58, in cui il file con cui
si vuole rinominare già esiste.
Questo probabilmente perchè un altro programma sta lavorando al file
originale (e non so quando lavora o meno) e se ha liberato il file.
Vorrei sapere se l'istruzione kill da errori intercettabili o no in
modo da poter intevenire al codice di errore, o se effettivamente
cancella il file ed l'altro programma lo ricrea.
Grazie
Sergio

s.tar...@binapg.it
 ha scritto:

Credo che dipenda molto dalla sequenza dei processi che metti in atto e
dai loro tempi
di esecuzione.
Spesso basta rendere Sincrone le istruzioni di cui non si ha la
certezza sul tempo di esecuzione inserendo un DoEvents(penso esista
anche in VB6) l'esempio in questo caso potrebbe essere proprio a valle
di operazioni come la Copia di File...!
Ora tu non hai postato il codice che usi, ma spesso la sequenza di tali
operazioni
è Asincrona pertanto è possibile si possano verificare
sovrapposizioni di azioni
che danno origine a quanto accenni.
Ciao
@Alex

Alessandro Baraldi ha scritto:

Si, ma un DoEvents mi inserisce una mia istruzione all'interno dei
processi della cpu.
Il problema è che se l'altro programma non ha finito la scrittura di
questo file non posso intervenire tra un DoEvents ed un'altro.
Devo sapere se questo processo di scrittura è terminato oppure no, in
modo da poter intervenire liberamente sul file generato e quindi
convertirlo, cancellarlo e poi rimnominare quello che ho fatto.
Il problema è sapere se l'istruzione KILL genera dei codici di errore
o no.
Sergio

 Sergio
Forse non ho capito.
Tu nel primo post non hai detto che sei tu dal tuo applicativo a
gestire tutto...?
Visto che non mi è chiarissimo l'ambito in cui ti muovi provo a
rispondere all'ultimo
tuo quesito.
La funzione Kill come qualsiasi altra ovviamente restituisce errori in
caso di Fallimento.
Public Sub DeleteFile(FilePath As String)
'Cancella file
   On Error GoTo error
   Kill FilePath$
   Exit Sub
error:
   Select Case Err.Number   ' Valuta il numero di errore.
      Case 55   ' Errore "File già aperto".
      Case Else
         MsgBox Err.Number & " " & Err.Description, vbExclamation,
"Error"
   End Select
End Sub
Questo è solo un esempio, poi vedi tu se riesci a gestire quanto dici.
Ciao
@Alex

Alessandro Baraldi ha scritto:

Questo è il mio codice (semplificato)
ON Error goto Errore_Conversione
'
' Routine che legge il file File$ e che scrive in un file temporaneo
indirizzato
' da CartellaTemporanea & FileTemporaneo.
' Anche qui non mi da alcun errore, che so, file occupato o quant'altro
'
Kill File$ ' <--- non da nessun errore
Name CartellaTemporanea & FileTemporaneo As File$ '<------ da l'errore
58 File già esistente 
Sergio

 Sergio
@Alex

Alessandro Baraldi ha scritto:
Per correttezza mi è sfuggito, meglio così:
If Len(Dir(File$)) > 0 Then
   Kill File$
   DoEvents
End if
Name CartellaTemporanea & FileTemporaneo As File$
In ogni caso ti sei assicurato di aver chiuso i 2 File prima....?
@Alex

 cancella il file ed l'altro programma lo ricrea.
Quando apri il primo file in lettura lo devi aprire in modo esclusivo, in 
modo che nessun altro ci possa lavorare oltre a te.
Aprendolo così inoltre la Open da errore se il file è già in uso.
Una volta fatte tutte le tue operazioni chiudi e cancelli il file e rinomini 
il vecchio.
Questo è l'unico sistema che ti garantisce il risultato.
(In realtà il sistema ottimale sarebbe sovrascrivere il vecchio file ancora 
aperto e poi troncarlo e chiuderlo, ma occorre ricorrere all'API per 
troncare e se non si lavora in condizioni critiche non mi pare il caso).
Ciao 

Fabio ha scritto:

Grazie Fabio.
Solo ora ho visto il post e mi era sfuggita questa possibilità.
La implemento subito....
Sergio