Eliminazione di un file in VBA


Risposte:


168

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:

  • Verifica la presenza di una stringa vuota.
  • Verificare la presenza di una stringa contenente caratteri illegali in un nome / percorso di file

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.


grazie - cosa succede se esistono due file con lo stesso nome che esistono, il sub DeleteFile li ucciderà entrambi o solo uno? qualsiasi consiglio molto apprezzato.
BKSpurgeon

6
Non puoi avere due file con lo stesso nome in una directory.
Onorio Catenacci

52

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).


7
Utilizzando questa sintassi senza dichiarare un oggetto di scripting di file, è necessario aggiungere un riferimento per Microsoft Scripting Runtime, altrimenti: Dim fs As New Scripting.FileSystemObject
pghcpa

5
è inoltre necessario fare riferimento alla libreria di scripting. vedi qui: stackoverflow.com/questions/3233203/...
ekkis

Poiché non esiste alcuna variabile da impostare su Nothing, c'è il rischio che FileSystemObject rimanga in memoria, causando una perdita o un altro problema?
johny why

No, verrà scartato dopo "Termina con". Poiché non è assegnato a una variabile, l'effetto è simile all'oggetto che è stato assegnato a una variabile che è stata impostata su "Nothing".
jony

15

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!


4
Hai sollevato un buon punto ma, come la maggior parte delle cose, penso che dipenda dal contesto e talvolta avere semplicemente una funzione "File Exists" è utile oltre alla cancellazione.
Onorio Catenacci

3
+1: forse l'utente dell'applicazione vuole essere chiesto prima di rimuovere un file: ad esempio, usando ActiveWorkbook.SaveCopyAsnon è possibile sovrascrivere, quindi devi prima rimuovere il file esistente con lo stesso nome file.
Joël

ma non dovresti mai usare On Error Resume Next, o almeno così mi è stato detto: D Certo, questo è un consiglio ridicolo, e la tua risposta è corretta.
johny why

La 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, vbNormalprende cura di questo in modo eloquente per te.
elektrykalAJ

11

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 

3
So che questa domanda e risposta sono vecchie, ho solo pensato di aggiungere che l'uso di Len () per testare le stringhe (e le funzioni che restituiscono stringhe) sembra essere più veloce dei confronti di stringhe letterali in VBA.
JimmyPena

7
Il motivo per cui 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 vbNullStringinvece in quanto è una costante e non utilizza più memoria.
Renaud Bompuis

7

In VB normalmente si Dirtrova la directory del file. Se non è vuoto, allora esiste e quindi utilizzare Killper eliminare il file.

test = Dir(Filename)
If Not test = "" Then
    Kill (Filename)
End If

6

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

Uso anche il metodo FileSystemObject, poiché Kill non è in grado di eliminare file / cartelle con
diacrite

Questo è il metodo che utilizzo .. Qualcuno che lo implementa desidera utilizzare il controllo degli errori e DisplayAlerts = false. (Il file non verrà eliminato se è in uso, quindi deve avere una trappola di errore)
Gregg Burns

3

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.


Questa è un'ottima alternativa, se asynch è ciò che desideri.
johny why

2

È 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 .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.