Відповіді:
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
Знову я залишаю вам обробку помилок, і знову це:
Чи має це поводитися по-різному для каталогу проти файлу? Чи повинен користувач явно повинен вказати, що хоче видалити каталог?
Ви хочете, щоб код автоматично скинув атрибут "лише для читання" або користувачеві слід дати певну ознаку того, що атрибут "лише для читання" встановлений?
EDIT: Позначте цю відповідь як вікі спільноти, щоб кожен міг її змінити за потреби.
Альтернативний спосіб кодування відповіді Бретцького, з яким я інакше цілком згоден
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
Зверніть увагу на подвійні лапки (символ 34 ASCII) навколо імені файлу: я припускаю, що у вас є мережевий шлях або довге ім'я файлу, що містить пробіли.
Якщо це великий файл, або він є повільним мережевим зв’язком, це шлях. Звичайно, ти ніколи не дізнаєшся, чи спрацювало це чи ні; але ви відновите свою VBA негайно, і бувають випадки, коли це краще, ніж очікувати мережу.
Ви можете встановити посилання на бібліотеку Scripting.Runtime, а потім використати FileSystemObject. Він має метод DeleteFile та метод FileExists.
Дивіться статтю MSDN тут .