Видалення файлу в VBA


Відповіді:


168

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: Позначте цю відповідь як вікі спільноти, щоб кожен міг її змінити за потреби.


дякую - що, якщо існуватимуть два файли з тим самим іменем, буде знищено підрозділ DeleteFile обох або лише один? будь-яка порада дуже цінується.
BKSpurgeon

6
У каталозі не може бути двох файлів з однаковим іменем.
Оноріо Катенач

52

Альтернативний спосіб кодування відповіді Бретцького, з яким я інакше цілком згоден

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

Той самий ефект, але менша кількість (ну, взагалі жодної) змінних декларацій.

FileSystemObject - це дійсно корисний інструмент, з яким варто дружити. Крім усього іншого, для написання текстових файлів це часом може бути швидше, ніж застаріла альтернатива, що може здивувати кількох людей. (На мій досвід, принаймні, YMMV).


7
Використовуючи цей синтаксис без оголошення об’єкта сценарію файлу, потрібно додати посилання на Microsoft Scripting Runtime, інакше: Dim fs As New Scripting.FileSystemObject
pghcpa

5
вам також потрібно посилатися на бібліотеку сценаріїв. дивіться тут: stackoverflow.com/questions/3233203 / ...
ekkis

Оскільки немає змінної, яку слід встановити на Ніщо, чи існує ризик, що FileSystemObject залишиться в пам'яті, викликаючи протікання або іншу проблему?
johny чому

Ні, він буде відкинутий після "Кінець". Оскільки він не призначений змінній, ефект схожий на об'єкт, призначений змінній, яка була встановлена ​​на "Нічого".
jony

15

Я, мабуть, отримаю це полум'я, але який сенс перевірити існування, якщо ви просто збираєтесь його видалити? Один з моїх головних вихованців - це додаток, що викидає діалогове вікно про помилку, на зразок "Не вдалося видалити файл, його не існує!"

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
Ви піднімаєте хорошу точку, але, як і більшість речей, я думаю, це залежатиме від контексту, а іноді просто функція "Файли існують" зручна, крім видалення.
Оноріо Катенац

3
+1: можливо, користувач програми хоче, щоб його запитали перед тим, як видалити файл: наприклад, використання ActiveWorkbook.SaveCopyAsне в змозі перезаписати, тому спочатку потрібно видалити існуючий файл з тим же ім'ям файлу.
Joël

але ти ніколи не повинен користуватися On Error Resume Next, або мені так сказали: D Звичайно, це смішні поради, і ваша відповідь правильна.
johny чому

Len(dir(...))Частина не ВИКЛЮЧНО для перевірки існування. Також перевірити , якщо файл прихований , так як прихований файл буде повертати порожній рядок , навіть якщо вона існує (і ви не зможете видалити його): Dir(hiddenFile) = "". Отже, частина SetAttr FileToDelete, vbNormalкрасномовно піклується про це за вас.
elektrykalAJ

11

Для перевірки наявності файлу та видалення його можна використати наступне.

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

3
Я знаю, що це запитання та відповіді старі, я просто подумав, що додам, що використання Len () для тестування рядків (і функцій, що повертають рядки) здається, швидше, ніж порівняння рядкових рядків у VBA.
JimmyPena

7
Причина того, що Len()LenB(), що ще швидше) швидше порівняння рядків, полягає в тому, що в пам'яті рядки VB передують їх довжині. Len / LenB просто тягніть довжину з цього місця пам'яті, вони не повинні перебирати рядок, щоб знати його довжину. З іншого боку, використання порівняння рядків має ще багато роботи. Крім того, уникайте використання ""в VB, оскільки він завжди виділяє нову рядок. Використовуйте vbNullStringнатомість, оскільки це константа і не використовує більше пам’яті.
Рено Бомпуа

7

У 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

Я також використовую метод FileSystemObject, оскільки Kill не в змозі видалити файли / папки з
діакритом

Це метод, який я використовую. Хтось, хто реалізує це, хоче використовувати перевірку помилок і DisplayAlerts = false. (Файл не буде
Грегг Бернс

3

Ось підказка: чи ви повторно використовуєте ім’я файлу, чи плануєте зробити щось, що вимагає видалення негайно?

Немає?

Ви можете отримати VBA для запуску команди DEL "C: \ TEMP \ scratchpad.txt" / F з командного рядка асинхронно за допомогою VBA.Shell:

Оболонка "DEL" & chr (34) & strPath & chr (34) & "/ F", vbHide

Зверніть увагу на подвійні лапки (символ 34 ASCII) навколо імені файлу: я припускаю, що у вас є мережевий шлях або довге ім'я файлу, що містить пробіли.

Якщо це великий файл, або він є повільним мережевим зв’язком, це шлях. Звичайно, ти ніколи не дізнаєшся, чи спрацювало це чи ні; але ви відновите свою VBA негайно, і бувають випадки, коли це краще, ніж очікувати мережу.


Це чудова альтернатива, якщо асинхрон - це те, що ви хочете.
Джоні чому

2

Ви можете встановити посилання на бібліотеку Scripting.Runtime, а потім використати FileSystemObject. Він має метод DeleteFile та метод FileExists.

Дивіться статтю MSDN тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.