2008-09-15 17 views

Antwort

124

1.) Überprüfen Sie here. Im Grunde tun:

Function FileExists(ByVal FileToTest As String) As Boolean 
    FileExists = (Dir(FileToTest) <> "") 
End Function 

Ich werde überlasse es Ihnen, die verschiedenen Fehlerbehandlung erforderlich, um herauszufinden, aber diese sind unter den Fehlerbehandlung Dinge, die ich in Erwägung ziehen würde:

  • prüfen für einen leeren Zeichenfolge wird übergeben.
  • prüfen für eine Zeichenfolge Zeichen illegal in einem Dateinamen/Pfad

2.) Wie enthält eine Datei zu löschen. Sehen Sie sich this. an. Verwenden Sie den Befehl Kill, aber Sie müssen die Möglichkeit einer schreibgeschützten Datei berücksichtigen. Hier ist eine Funktion für Sie:

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 

Noch einmal, ich werde den Fehler verlassen, um Ihnen die Handhabung und wieder das sind die Dinge, die ich betrachten würde:

  • Sollte dies verhalten sich anders für ein Verzeichnis vs . eine Datei? Muss ein Benutzer explizit angeben, dass er ein Verzeichnis löschen möchte?

  • Soll der Code das schreibgeschützte Attribut automatisch zurücksetzen oder sollte dem Benutzer eine Art Hinweis gegeben werden, dass das schreibgeschützte Attribut festgelegt ist?


EDIT: diese Antwort als Community Wiki-Kennzeichnung, so dass jeder es ändern kann, wenn nötig.

+0

danke - Was ist, wenn es zwei Dateien mit dem gleichen Namen gibt, die vorhanden sind, wird der DeleteFile-Unterbefehl beide oder nur einen? Jeder Ratschlag wird sehr geschätzt. – BKSpurgeon

+6

Sie können nicht zwei Dateien mit demselben Namen in einem Verzeichnis haben. –

+0

brilliant natürlich! – BKSpurgeon

6

In VB seine normalerweise Dir das Verzeichnis der Datei zu finden. Wenn es nicht leer ist, existiert es und benutzt dann Kill, um die Datei loszuwerden.

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

Folgendes kann verwendet werden, um das Vorhandensein einer Datei zu testen und sie anschließend zu löschen.

Dim aFile As String 
aFile = "c:\file_to_delete.txt" 
If Len(Dir$(aFile)) > 0 Then 
    Kill aFile 
End If 
+3

Ich weiß, dass diese Frage und Antwort alt sind, dachte nur, ich würde hinzufügen, dass Len() zu Testzeichenfolgen (und Funktionen, die Zeichenfolgen zurückgeben) scheint schneller als literale Zeichenfolge Vergleiche in VBA. – JimmyPena

+5

Der Grund, dass 'Len()' (und 'LenB()', die noch schneller ist) schneller als String-Vergleich ist, dass im Speicher VB-Strings ihre Länge vorangestellt ist. Len/LenB ziehen nur die Länge von diesem Speicherort, sie müssen nicht durch die Zeichenfolge iterieren, um ihre Länge zu kennen. Auf der anderen Seite hat die Verwendung von String-Vergleich viel mehr Arbeit zu tun. Vermeiden Sie darüber hinaus '' '' in VB, da immer eine neue Zeichenfolge zugewiesen wird. Verwenden Sie stattdessen "vbNullString", da es eine Konstante ist und nicht mehr Speicher belegt. –

2

Sie können einen Verweis auf die Scripting.Runtime-Bibliothek festlegen und dann das FileSystemObject verwenden. Es verfügt über eine DeleteFile-Methode und eine FileExists-Methode.

Siehe den MSDN-Artikel here.

10

Ich werde wahrscheinlich dafür geflammt, aber was ist der Sinn der Existenz zu testen, wenn Sie es nur löschen werden? Eine meiner größten Sorgen ist eine App, die einen Fehlerdialog mit etwas wie "Datei konnte nicht gelöscht werden, existiert nicht!"

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. 

Wenn die Datei nicht an erster Stelle existiert, Mission erfüllt!

+3

Sie heben einen guten Punkt, aber, wie die meisten Dinge, denke ich, es würde abhängig vom Kontext sein und manchmal einfach eine "Datei existiert" Funktion ist praktisch neben dem Löschen. –

+2

+1: vielleicht möchte der Benutzer der Anwendung vor dem Entfernen einer Datei gefragt werden: zum Beispiel, mit 'ActiveWorkbook.SaveCopyAs' ist nicht in der Lage zu überschreiben, so müssen Sie zuerst vorhandene Datei mit dem gleichen Dateinamen entfernen. –

+0

, aber Sie sollten nie 'On Error Resume Next' verwenden, oder so wurde mir gesagt: D Natürlich ist das lächerlich, und Ihre Antwort ist richtig. –

4

einen Verweis auf die Bibliothek Scripting.Runtime und dann das Filesystem verwenden:

Dim fso as New FileSystemObject, aFile as File 

if (fso.FileExists("PathToFile")) then 
    aFile = fso.GetFile("PathToFile") 
    aFile.Delete 
End if 
+0

Ich benutze auch die FileSystemObject Methode, da Kill Dateien/Ordner mit Diacriti nicht löschen kann –

39

Eine alternative Art und Weise Brettski Antwort zu codieren, mit dem ich sonst ganz zustimmen, könnte

With New FileSystemObject 
    If .FileExists(yourFilePath) Then 
     .DeleteFile yourFilepath 
    End If 
End With 
sein

Gleicher Effekt, aber weniger (na ja, überhaupt keine) variable Deklarationen.

Das FileSystemObject ist ein wirklich nützliches Werkzeug und es lohnt sich, mit ihm zu kommunizieren. Abgesehen von allem anderen, für das Schreiben von Textdateien kann es tatsächlich manchmal schneller sein als die Legacy-Alternative, die einige Leute überraschen kann. (Nach meiner Erfahrung zumindest, YMMV).

+5

Bei Verwendung dieser Syntax ohne Deklaration eines Dateiskriptobjekts muss eine Referenz für Microsoft Scripting Runtime hinzugefügt werden, sonst: Dim fs As New Scripting.FileSystemObject – pghcpa

+2

Sie müssen auch auf die Skriptbibliothek verweisen. siehe hier: http://stackoverflow.com/questions/3233203/how-doi-i-use-filesystemobject-in-vba – ekkis

+0

Da es keine Variable gibt, die auf Nothing gesetzt werden kann, besteht die Gefahr, dass das FileSystemObject im Speicher bleibt und dies verursacht ein Leck oder ein anderes Problem? –

3

Hier ein Tipp: Verwenden Sie den Dateinamen erneut oder planen Sie etwas, das sofort gelöscht werden muss?

Nein?

können Sie erhalten VBA den Befehl DEL abzufeuern "C: \ TEMP \ scratchpad.txt"/F von der Eingabeaufforderung asynchron mit VBA.Shell:

Shell "DEL" & chr (34) & strPath & chr (34) & "/ F", vbHide

Beachten Sie die doppelten Anführungszeichen (ASCII-Zeichen 34) um den Dateinamen: ich gehe davon aus, dass Sie einen Netzwerkpfad haben, oder eine lange Dateiname mit Leerzeichen

Wenn es sich um eine große Datei oder um eine langsame Netzwerkverbindung handelt, ist Fire-and-Forget der richtige Weg. Natürlich kann man nie sehen, ob das funktioniert oder nicht; Sie setzen Ihre VBA jedoch sofort fort, und manchmal ist dies besser, als auf das Netzwerk zu warten.

+0

Dies ist eine großartige Alternative, * wenn * asynch ist was du willst. –