代码之家  ›  专栏  ›  技术社区  ›  Community wiki

在VBA中删除文件

  •  135
  • Community wiki  · 技术社区  · 2 年前

    使用VBA,如何:

    1. 测试文件是否存在,如果存在,
    2. 删除它?
    9 回复  |  直到 2 年前
        1
  •  144
  •   community wiki 5 revs, 3 users 88% Onorio Catenacci    9 年前

    1.)检查 here 。基本上是这样做的:

    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
    

    同样,我将把错误处理留给您,我会再次考虑以下几点:

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

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


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

        2
  •  45
  •   Mike Woodhouse    11 年前

    另一种编码布雷茨基答案的方法,我完全同意,可能是

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

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

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

        3
  •  10
  •   Rich Adams    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.
    

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

        4
  •  10
  •   JohnFx    12 年前

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

    Dim aFile As String
    aFile = "c:\file_to_delete.txt"
    If Len(Dir$(aFile)) > 0 Then
         Kill aFile
    End If 
    
        5
  •  6
  •   ZygD    10 年前

    在VB中,它通常 Dir 以查找文件的目录。如果它不是空白的,则它存在,然后使用 Kill 以清除该文件。

    test = Dir(Filename)
    If Not test = "" Then
        Kill (Filename)
    End If
    
        6
  •  4
  •   Brettski    17 年前

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

    Dim fso as New FileSystemObject, aFile as File
    
    if (fso.FileExists("PathToFile")) then
        aFile = fso.GetFile("PathToFile")
        aFile.Delete
    End if
    
        7
  •  3
  •   community wiki 2 revs Nile    11 年前

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

    您可以让VBA从命令提示符处启动命令DEL“C:\TEMP\stratchpad.txt”/F 异步 使用VBA。外壳:

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

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

    如果它是一个大文件,或者是在一个缓慢的网络连接上,即发即弃是一种方法。 当然,你永远看不到这是否有效;但您可以立即恢复VBA,有时这比等待网络要好。

        8
  •  2
  •   Darrel Miller    17 年前

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

    请参阅MSDN文章 here

        9
  •  1
  •   community wiki 2 revs Zach Minot    8 年前

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

    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
    
    推荐文章