Risposte:
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 operazioni di gestione degli errori necessarie, ma queste sono tra le cose di gestione degli errori che prenderei in considerazione:
2.) Come eliminare un file. Guarda 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 queste sono le cose che prenderei in considerazione:
Questo dovrebbe comportarsi in modo diverso per una directory rispetto a un file? Un utente dovrebbe dover indicare esplicitamente che desidera eliminare una directory?
Vuoi che il codice ripristini automaticamente l'attributo di sola lettura o dovrebbe essere fornito all'utente una sorta di indicazione che l'attributo di sola lettura è impostato?
MODIFICA: contrassegnare questa risposta come wiki della comunità in modo che chiunque possa modificarla se necessario.
Un modo alternativo per codificare la risposta di Brettski, con cui altrimenti sono completamente d'accordo, potrebbe essere
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
Stesso effetto ma meno (beh, nessuna) dichiarazioni di variabili.
FileSystemObject è uno strumento davvero utile e con cui vale la pena fare amicizia. A parte qualsiasi altra cosa, per la scrittura di file di testo a volte può effettivamente essere più veloce dell'alternativa legacy, il che potrebbe sorprendere alcune persone. (Almeno nella mia esperienza, YMMV).
Probabilmente verrò infiammato per questo, ma qual è lo scopo di testare l'esistenza se lo elimini? Uno dei miei principali problemi è 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 in primo luogo, missione compiuta!
ActiveWorkbook.SaveCopyAs
non è possibile sovrascrivere, quindi devi prima rimuovere il file esistente con lo stesso nome file.
On Error Resume Next
, o almeno così mi è stato detto: D Certo, questo è un consiglio ridicolo, e la tua risposta è corretta.
Len(dir(...))
parte non è ESCLUSIVAMENTE per verificare l'esistenza. E 'anche verificando se il file è nascosto a causa di un file nascosto restituisce una stringa vuota, anche se esiste (e non sarà in grado di eliminarlo): Dir(hiddenFile) = ""
. Quindi, la parte si SetAttr FileToDelete, vbNormal
prende cura di questo in modo eloquente per te.
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
Len()
(e LenB()
, che è ancora più veloce) sono più veloci del confronto tra stringhe è che in memoria, le stringhe VB sono precedute dalla loro lunghezza. Len / LenB estraggono semplicemente la lunghezza da quella posizione di memoria, non è necessario iterare attraverso la stringa per conoscerne la lunghezza. D'altra parte, l'uso del confronto tra stringhe ha molto più lavoro da fare. Inoltre, evitare di utilizzare ""
in VB poiché alloca sempre una nuova stringa. Usa vbNullString
invece in quanto è una costante e non utilizza più memoria.
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 suggerimento: stai riutilizzando il nome del file o stai pianificando di fare qualcosa che richiede l'eliminazione immediata?
No?
Puoi fare in modo che VBA attivi il comando DEL "C: \ TEMP \ scratchpad.txt" / F dal prompt dei comandi in modo asincrono utilizzando VBA.Shell:
Shell "DEL" & chr (34) & strPath & chr (34) & "/ F", vbHide
Nota 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 su una connessione di rete lenta, il fuoco e dimentica è la strada da percorrere. Naturalmente, non puoi 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.
Consulta l'articolo MSDN qui .