Удаление файла в VBA

Используя VBA, как я могу:

  • проверьте, существует ли файл, и если да,
  • удалить его?

Ответ 1

1.) Проверьте здесь. В основном это:

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

Я оставлю это вам, чтобы выяснить, нужна ли обработка ошибок, но они относятся к обработке ошибок, которые я бы рассматривал:

  • Проверьте, не прошла ли пустая строка.
  • Проверьте, что строка, содержащая символы, незаконна в имени файла/пути

2.) Как удалить файл. Посмотрите на this. В основном используйте команду Kill, но вам нужно разрешить доступ к файлу только для чтения. Здесь функция для вас:

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

Опять же, я оставлю вам обработку ошибок, и снова это то, что я подумал бы:

  • Должно ли это вести себя по-другому для каталога или файла? Должен ли пользователь явно указывать, что он хочет удалить каталог?

  • Вы хотите, чтобы код автоматически reset атрибут только для чтения или пользователь должен был указать какой-то признак того, что атрибут только для чтения установлен?


EDIT: Отметьте этот ответ как вики сообщества, чтобы любой мог его изменить, если это необходимо.

Ответ 2

Альтернативный способ кодирования ответа Бреттского, с которым я в целом согласен, может быть

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

Тот же эффект, но меньше (ну, вообще-то) никаких объявлений переменных.

FileSystemObject - действительно полезный инструмент, и стоит позаботиться о дружелюбности. Помимо всего прочего, для написания текстовых файлов это может иногда быть быстрее, чем альтернатива, которая может удивить некоторых людей. (По моему опыту, по крайней мере, YMMV).

Ответ 3

Я, вероятно, поплачу за это, но в чем смысл тестирования на существование, если вы просто собираетесь его удалить? Одним из моих главных мошенников для домашних животных является приложение, отображающее диалоговое окно с ошибкой с чем-то вроде "Не удалось удалить файл, его не существует!"

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.

Если файл не существует в первую очередь, миссия выполнена!

Ответ 4

Для проверки наличия файла можно использовать следующее: а затем удалить его.

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

Ответ 5

В VB его обычно Dir найти каталог файла. Если он не пуст, он существует, а затем используйте Kill, чтобы избавиться от файла.

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

Ответ 6

установите ссылку на библиотеку Scripting.Runtime, а затем используйте FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

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

Ответ 7

Вот совет: вы повторно используете имя файла или планируете сделать что-то, требующее немедленного удаления?

Нет?

Вы можете заставить VBA запускать команду DEL "C:\TEMP\scratchpad.txt" /F из командной строки асинхронно с помощью VBA.Shell:

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

Обратите внимание на двойные кавычки (символ ASCII 34) вокруг имени файла: я предполагаю, что у вас есть сетевой путь или длинное имя файла, содержащее пробелы.

Если это большой файл, или он при медленном сетевом подключении, это способ пойти и забыть.  Конечно, вы никогда не узнаете, работает ли это или нет; но вы немедленно возобновляете свой VBA, и есть моменты, когда это лучше, чем ждать сети.

Ответ 8

Вы можете установить ссылку на библиотеку Scripting.Runtime, а затем использовать FileSystemObject. Он имеет метод DeleteFile и метод FileExists.

См. статью MSDN здесь.

Ответ 9

2 строки кода в VBA..

Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FileExists(strPath) Then FSO.DeleteFile ("" & strPath & "")