在 VBA 中删除文件

使用 VBA,我怎样才能:

  1. 测试文件是否存在,如果存在,
  2. 删掉?
546953 次浏览

在 VB 中它通常用 Dir来查找文件的目录。如果它不是空的,那么它就存在,然后使用 Kill删除该文件。

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

下面的代码可用于测试文件是否存在,然后删除该文件。

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

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

同样,我将把错误处理留给您,这些也是我要考虑的事情:

  • 对于一个目录和一个文件,它的行为是否应该有所不同?用户是否必须明确表示要删除目录?

  • 您是希望代码自动重置只读属性,还是应该向用户提供设置了只读属性的某种指示?


编辑: 将这个答案标记为社区维基,以便任何人都可以在需要时修改它。

可以设置对脚本的引用。运行库,然后使用 FileSystemObject。它具有 DeleteFile 方法和 FileExists 方法。

请参阅 MSDN 文章 给你

我可能会因此受到责备,但是如果你只是想删除它,那么测试存在的意义是什么呢?我的一个主要烦恼是一个应用程序抛出一个错误对话框,类似“无法删除文件,它不存在!”

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.

如果文件一开始就不存在,任务就完成了!

设置对 Scripting.Runtime 库 的引用,然后使用 FileSystemObject:

Dim fso as New FileSystemObject, aFile as File


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

另一种编码布雷特斯基答案的方法(我完全同意这种方法)可能是

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

效果相同,但变量声明更少(好吧,根本没有)。

FileSystemObject 是一个非常有用的工具,非常值得友好使用。除此之外,对于文本文件编写来说,它实际上有时比遗留的替代方案更快,这可能会让一些人感到惊讶。(至少以我的经验来看,YMMV)。

这里有一个提示: 您是在重用文件名,还是计划执行需要立即删除的操作?

没有吗?

您可以使用 VBA.Shell 从命令提示符 异步的中启动命令 DEL“ C: TEMP scrachpad.txt”/F:

Shell“ DEL”& chr (34) & strPath & chr (34) & “/F”,vbHide

注意文件名周围的双引号(ASCII 字符34) : 我假设您有一个网络路径,或者一个包含空格的长文件名。

如果是一个大文件,或者是在一个缓慢的网络连接上,那么就只能这样了。 当然,您永远不会看到这样做是否有效; 但是您可以立即恢复 VBA,而且有时候这比等待网络更好。

第一个对我有效的解决方案的简短版本:

Sub DeleteFile(ByVal FileToDelete As String)
If (Dir(FileToDelete) <> "") Then
' First remove readonly attribute, if set
SetAttr FileToDelete, vbNormal
' Then delete the file
Kill FileToDelete
End If
End Sub