在VBA中删除文件

问题描述 投票:0回答:9

使用VBA,我怎样才能:

  1. 测试文件是否存在,如果存在,
  2. 删除它?
vba file-io delete-file file-exists
9个回答
211
投票

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

再次,我将把错误处理留给你,这些是我会考虑的事情:

  • 目录和文件的行为应该有所不同吗? 用户是否必须明确表明他们想要删除目录?

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


编辑:将此答案标记为社区维基,以便任何人都可以根据需要对其进行修改。


60
投票

对布雷特斯基的答案进行编码的另一种方法,我完全同意,可能是

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

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

FileSystemObject 是一个非常有用的工具,非常值得熟悉。除此之外,对于文本文件写入,它有时实际上比传统替代方案更快,这可能会让一些人感到惊讶。 (至少根据我的经验,YMMV)。


17
投票

我可能会因此而受到批评,但如果你只是要删除它,那么测试它的存在又有什么意义呢?我最讨厌的事情之一是应用程序抛出一个错误对话框,其中包含“无法删除文件,它不存在!”之类的内容。

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.

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


13
投票

以下可用于测试文件是否存在,然后将其删除。

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

8
投票

在 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

4
投票

这里有一个提示:您是否正在重复使用该文件名,或者计划执行需要立即删除的操作?

没有?

您可以使用 VBA.Shell 让 VBA 从命令提示符异步触发命令 DEL "C:\TEMP\scratchpad.txt" /F:

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

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

如果文件很大,或者网络连接速度较慢,则“即发即弃”是最佳选择。 当然,你永远无法知道这是否有效。但您会立即恢复 VBA,有时这比等待网络更好。


2
投票

您可以设置对 Scripting.Runtime 库的引用,然后使用 FileSystemObject。 它有一个DeleteFile方法和一个FileExists方法。

请参阅 MSDN 文章此处


0
投票

对我有用的第一个解决方案的较短版本:

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
© www.soinside.com 2019 - 2024. All rights reserved.