Ответы:
1.) Отметьте здесь . В основном это делают:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Я оставлю это на ваше усмотрение, чтобы разобраться в различных необходимых обработках ошибок, но я бы рассмотрел следующие вопросы обработки ошибок:
2.) Как удалить файл. Посмотри на это. В основном используйте команду 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
Опять же, я оставлю обработку ошибок вам, и снова вот что я рассмотрю:
Должно ли это вести себя по-разному для каталога и файла? Должен ли пользователь явно указывать, что он хочет удалить каталог?
Вы хотите, чтобы код автоматически сбрасывал атрибут «только для чтения», или пользователю следует дать какое-то указание на то, что атрибут «только для чтения» установлен?
РЕДАКТИРОВАТЬ: пометить этот ответ как вики сообщества, чтобы каждый мог его изменить при необходимости.
Альтернативный способ закодировать ответ Бреттски, с которым я полностью согласен, может быть
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
Тот же эффект, но меньше (ну, совсем не объявлений) переменных.
FileSystemObject - действительно полезный инструмент, с которым стоит подружиться. Помимо всего прочего, для записи текстовых файлов это иногда может быть быстрее, чем унаследованная альтернатива, что может удивить некоторых людей. (По моему опыту, по крайней мере, YMMV).
Я, наверное, разозлюсь на это, но какой смысл проверять существование, если вы просто собираетесь его удалить? Одна из моих главных неприятностей - это приложение, которое выдает диалоговое окно с ошибкой вроде «Не удалось удалить файл, он не существует!»
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.
Если файл вообще не существует, миссия выполнена!
ActiveWorkbook.SaveCopyAs
не может перезаписать, поэтому вам сначала нужно удалить существующий файл с тем же именем файла.
On Error Resume Next
, по крайней мере, мне так сказали: D Конечно, это смешной совет, и ваш ответ правильный.
Len(dir(...))
Часть не ИСКЛЮЧИТЕЛЬНО для проверки существования. Также проверить , если файл скрыт , так как скрытый файл будет возвращать пустую строку , даже если она существует (и вы не сможете удалить его): Dir(hiddenFile) = ""
. Следовательно, часть SetAttr FileToDelete, vbNormal
красноречиво позаботится об этом за вас.
Следующее можно использовать для проверки существования файла, а затем для его удаления.
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
Len()
(и LenB()
что еще быстрее) быстрее, чем сравнение строк, заключается в том, что в памяти строкам VB предшествует их длина. Len / LenB просто извлекают длину из этой ячейки памяти, им не нужно перебирать строку, чтобы узнать ее длину. С другой стороны, при использовании сравнения строк нужно сделать гораздо больше. Кроме того, избегайте использования ""
в VB, поскольку он всегда выделяет новую строку. Используйте vbNullString
вместо этого, поскольку это константа и не использует больше памяти.
установите ссылку на библиотеку Scripting.Runtime, а затем используйте FileSystemObject:
Dim fso as New FileSystemObject, aFile as File
if (fso.FileExists("PathToFile")) then
aFile = fso.GetFile("PathToFile")
aFile.Delete
End if
Вот совет: вы повторно используете имя файла или планируете сделать что-то, что требует немедленного удаления?
Нет?
Вы можете заставить VBA запускать команду DEL "C: \ TEMP \ scratchpad.txt" / F из командной строки асинхронно с помощью VBA.Shell:
Оболочка "DEL" & chr (34) & strPath & chr (34) & "/ F", vbHide
Обратите внимание на двойные кавычки (символ ASCII 34) вокруг имени файла: я предполагаю, что у вас есть сетевой путь или длинное имя файла, содержащее пробелы.
Если это большой файл или он находится в медленном сетевом соединении, запускать и забывать - лучший способ. Конечно, вы никогда не увидите, сработало это или нет; но вы сразу же возобновляете свой VBA, и бывают случаи, когда это лучше, чем ожидание сети.
Вы можете установить ссылку на библиотеку Scripting.Runtime, а затем использовать FileSystemObject. У него есть метод DeleteFile и метод FileExists.
См. Статью MSDN здесь .