Domanda

Utilizzando VBA, come posso:

  1. verificare se esiste un file e, in caso affermativo,
  2. Cancellalo?
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top