130

使用 VBA,我该如何:

  1. 测试文件是否存在,如果存在,
  2. 删除它?
4

9 回答 9

191

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

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

  • 对于目录和文件,这应该表现不同吗?用户是否必须明确表明他们要删除目录?

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


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

于 2008-09-15T23:12:17.560 回答
58

我完全同意Brettski答案的另一种编码方式可能是

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

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

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

于 2008-09-16T11:03:40.580 回答
16

我可能会为此大发雷霆,但如果你只是要删除它,那么测试存在的意义何在?我的一个主要烦恼是一个应用程序抛出一个错误对话框,例如“无法删除文件,它不存在!”

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.

如果文件首先不存在,则任务完成!

于 2008-09-15T23:34:22.953 回答
12

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

Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
     Kill aFile
End If 
于 2008-09-15T23:12:09.917 回答
8

在 VB 中,它通常Dir会找到文件的目录。如果它不为空,则它存在,然后用于Kill删除文件。

test = Dir(Filename)
If Not test = "" Then
    Kill (Filename)
End If
于 2008-09-15T23:11:17.703 回答
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
于 2008-09-15T23:40:20.660 回答
4

这里有一个提示:您是重新使用文件名,还是计划做一些需要立即删除的事情?

不?

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

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

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

如果它是一个大文件,或者它的网络连接速度很慢,那么一劳永逸是要走的路。当然,您永远无法看到这是否有效。但是您立即恢复您的 VBA,有时这比等待网络更好。

于 2014-10-02T17:09:17.557 回答
2

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

请参阅此处的 MSDN 文章。

于 2008-09-15T23:12:37.060 回答
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
于 2021-10-15T09:38:07.213 回答