Odpowiedzi:
1.) Sprawdź tutaj . Zasadniczo zrób to:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Zostawię ci ustalenie różnych potrzebnych do obsługi błędów, ale są to jedne z rzeczy, które rozważałem:
2.) Jak usunąć plik. Popatrz na to. Zasadniczo użyj polecenia Kill, ale musisz uwzględnić możliwość, że plik jest tylko do odczytu. Oto funkcja dla Ciebie:
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
Ponownie pozostawię obsługę błędów Tobie i ponownie rozważę następujące kwestie:
Czy powinno to zachowywać się inaczej w przypadku katalogu niż pliku? Czy użytkownik powinien wyraźnie wskazać, że chce usunąć katalog?
Czy chcesz, aby kod automatycznie resetował atrybut tylko do odczytu, czy też użytkownik powinien otrzymać jakąś wskazówkę, że ustawiono atrybut tylko do odczytu?
EDYCJA: Oznacz tę odpowiedź jako wiki społeczności, aby każdy mógł ją zmodyfikować, jeśli zajdzie taka potrzeba.
Alternatywnym sposobem zakodowania odpowiedzi Brettskiego, z którym w przeciwnym razie całkowicie się zgadzam, może być
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
Ten sam efekt, ale mniej (no cóż, żadnych) deklaracji zmiennych.
FileSystemObject to naprawdę przydatne narzędzie, z którym warto się zaprzyjaźnić. Poza wszystkim innym, zapisywanie plików tekstowych może czasami być szybsze niż starsza alternatywa, co może zaskoczyć kilka osób. (Przynajmniej z mojego doświadczenia, YMMV).
Prawdopodobnie zostanę za to podpalony, ale jaki jest sens testowania istnienia, jeśli zamierzasz go usunąć? Jednym z moich głównych irytujących zwierząt jest aplikacja wyświetlająca okno dialogowe błędu z komunikatem „Nie można usunąć pliku, nie istnieje!”
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.
Jeśli plik nie istnieje w pierwszej kolejności, misja zakończona!
ActiveWorkbook.SaveCopyAs
nie jest w stanie nadpisać, więc najpierw musisz usunąć istniejący plik o tej samej nazwie.
On Error Resume Next
, a przynajmniej tak mi powiedziano: D Oczywiście to absurdalna rada, a twoja odpowiedź jest poprawna.
Len(dir(...))
Część nie jest wyłącznie w celu sprawdzenia istnienia. To jest również sprawdzenie, czy plik jest ukryty , ponieważ ukryty plik zwróci pusty ciąg nawet jeśli istnieje (i nie będzie w stanie go usunąć) Dir(hiddenFile) = ""
. Dlatego część SetAttr FileToDelete, vbNormal
elokwentnie zajmuje się tym za Ciebie.
Aby sprawdzić, czy plik istnieje, a następnie go usunąć, można użyć poniższych instrukcji.
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
Len()
(i LenB()
, co jest jeszcze szybsze) są szybsze niż porównywanie ciągów, jest to, że w pamięci ciągi VB są poprzedzone ich długością. Len / LenB po prostu pobierają długość z tego miejsca w pamięci, nie muszą iterować ciągu, aby poznać jego długość. Z drugiej strony, użycie porównania ciągów wymaga znacznie więcej pracy. Ponadto unikaj używania ""
w VB, ponieważ zawsze przydziela nowy ciąg. Użyj vbNullString
zamiast tego, ponieważ jest to stała i nie zużywa więcej pamięci.
ustaw odniesienie do biblioteki Scripting.Runtime, a następnie użyj FileSystemObject:
Dim fso as New FileSystemObject, aFile as File
if (fso.FileExists("PathToFile")) then
aFile = fso.GetFile("PathToFile")
aFile.Delete
End if
Oto wskazówka: czy ponownie używasz nazwy pliku, czy planujesz zrobić coś, co wymaga natychmiastowego usunięcia?
Nie?
Możesz sprawić, aby VBA uruchamiał polecenie DEL "C: \ TEMP \ scratchpad.txt" / F z wiersza poleceń asynchronicznie za pomocą VBA.Shell:
Shell „DEL” & chr (34) & strPath & chr (34) & „/ F”, vbHide
Zwróć uwagę na podwójne cudzysłowy (znak ASCII 34) wokół nazwy pliku: Zakładam, że masz ścieżkę sieciową lub długą nazwę pliku zawierającą spacje.
Jeśli jest to duży plik lub ma wolne połączenie sieciowe, opuść i zapomnij. Oczywiście nigdy nie zobaczysz, czy to zadziałało, czy nie; ale natychmiast wznawiasz VBA i są chwile, kiedy jest to lepsze niż czekanie na sieć.
Można ustawić odwołanie do biblioteki Scripting.Runtime, a następnie użyć obiektu FileSystemObject. Ma metodę DeleteFile i metodę FileExists.
Zobacz artykuł MSDN tutaj .