Eliminazione di un file in VBA
-
09-06-2019 - |
Domanda
Utilizzando VBA, come posso:
- verificare se esiste un file e, in caso affermativo,
- Cancellalo?
Soluzione
1.) Controlla Qui.Fondamentalmente fai questo:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Lascerò a te il compito di capire le varie gestione degli errori necessarie, ma queste sono tra le cose di gestione degli errori che prenderei in considerazione:
- Controlla che venga passata una stringa vuota.
- Verificare la presenza di una stringa contenente caratteri non validi nel nome/percorso di un file
2.) Come eliminare un file.Guarda a Questo. Fondamentalmente usa il comando Kill ma devi consentire la possibilità che un file sia di sola lettura.Ecco una funzione per te:
Sub DeleteFile(ByVal FileToDelete As String)
If FileExists(FileToDelete) Then 'See above
' First remove readonly attribute, if set
SetAttr FileToDelete, vbNormal
' Then delete the file
Kill FileToDelete
End If
End Sub
Ancora una volta, lascerò a te la gestione degli errori e ancora una volta queste sono le cose che prenderei in considerazione:
Questo dovrebbe comportarsi diversamente per una directory rispetto aun file?Un utente dovrebbe indicare esplicitamente che desidera eliminare una directory?
Vuoi che il codice reimposti automaticamente l'attributo di sola lettura o che all'utente venga fornita una sorta di indicazione che l'attributo di sola lettura è impostato?
MODIFICARE:Contrassegnando questa risposta come wiki della comunità in modo che chiunque possa modificarla se necessario.
Altri suggerimenti
Potrebbe essere un modo alternativo per codificare la risposta di Brettski, con il quale per il resto sono completamente d'accordo
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
Stesso effetto ma meno dichiarazioni di variabile (beh, nessuna).
FileSystemObject è uno strumento davvero utile e vale la pena fare amicizia con lui.A parte tutto, per la scrittura di file di testo a volte può essere più veloce dell'alternativa legacy, il che potrebbe sorprendere alcune persone.(Almeno nella mia esperienza, YMMV).
Probabilmente verrò criticato per questo, ma che senso ha testarne l'esistenza se poi lo eliminerai?Uno dei miei maggiori crucci è un'app che lancia una finestra di dialogo di errore con qualcosa del tipo "Impossibile eliminare il file, non esiste!"
On Error Resume Next
aFile = "c:\file_to_delete.txt"
Kill aFile
On Error Goto 0
return Len(Dir$(aFile)) > 0 ' Make sure it actually got deleted.
Se il file non esiste, missione compiuta!
Quanto segue può essere utilizzato per verificare l'esistenza di un file e quindi per eliminarlo.
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
In VB è normale Dir
per trovare la directory del file.Se non è vuoto, esiste e quindi può essere utilizzato Kill
per eliminare il file.
test = Dir(Filename)
If Not test = "" Then
Kill (Filename)
End If
impostare un riferimento alla libreria Scripting.Runtime e quindi utilizzare FileSystemObject:
Dim fso as New FileSystemObject, aFile as File
if (fso.FileExists("PathToFile")) then
aFile = fso.GetFile("PathToFile")
aFile.Delete
End if
Ecco un consiglio:stai riutilizzando il nome del file o hai intenzione di fare qualcosa che richieda l'eliminazione immediata?
NO?
Puoi fare in modo che VBA attivi il comando DEL "C: EMP\scratchpad.txt" /F dal prompt dei comandi in modo asincrono utilizzando VBA.Shell:
Shell "DEL " & chr(34) & strPath & chr(34) & " /F ", vbHide
Notare le virgolette doppie (carattere ASCII 34) attorno al nome del file:Presumo che tu abbia un percorso di rete o un nome di file lungo contenente spazi.
Se si tratta di un file di grandi dimensioni o di una connessione di rete lenta, attiva e dimentica è la strada da percorrere.Naturalmente, non potrai mai vedere se ha funzionato o meno;ma riprendi immediatamente il tuo VBA e ci sono momenti in cui è meglio che aspettare la rete.
È possibile impostare un riferimento alla libreria Scripting.Runtime e quindi utilizzare FileSystemObject.Ha un metodo DeleteFile e un metodo FileExists.
Vedi l'articolo MSDN Qui.