【问题标题】:Remove directory and it's contents (files, subdirectories) without using FileSystemObject在不使用 FileSystemObject 的情况下删除目录及其内容(文件、子目录)
【发布时间】:2014-10-13 15:18:52
【问题描述】:

我想知道是否可以重写这段代码:

Private Sub PrepareDir(ByVal dir As String)
    Dim fso As New FileSystemObject
    If fso.FolderExists(dir) Then Call fso.DeleteFolder(dir, True)
    Call fso.CreateFolder(dir)
End Sub

使用 VBA 语句:Kill、MkDir 等。其中最“困难”的部分 - 删除非空目录。使用 FSO 可以轻松完成,但没有 FSO 怎么办?

【问题讨论】:

  • 出于好奇,您为什么不能/不想使用 FileSystemObject?
  • @DavidZemens - 我打赌这是家庭作业。没有理由不能简单地使用CreateObject("Scripting.FileSystemObject").DeleteFolder "x:\myFolder"
  • 是的,这可能是个好点 @ashleedawg 对我 +1 :)
  • @ashleedawg 作业?哈哈。这只是我个人的兴趣。得到 bc.sc.comp 后,我自己完成了所有作业。 2007 年获得学位。
  • 不使用 FileSystemObject 的一个很好的理由是它减少了依赖性,这可能会导致悲伤。例如。在 Mac 上运行时。我尽可能使用传统的 Basic 函数。

标签: excel vba filesystemobject


【解决方案1】:

删除文件夹无需删除文件。 取路径并循环搜索子文件夹,可以删除该子文件夹。 下面是示例:复制两个程序并粘贴到模块上

公共函数 Delete_Folder(ByVal FldrName 作为字符串) Dim fso, FSfolder As Object

Set fso = CreateObject("Scripting.FileSystemObject")
Set FSfolder = fso.GetFolder(Application.DefaultFilePath)' This is My Documents folder path

'你可以用你原来的文件夹路径替换

For Each Folder In FSfolder.SubFolders
    'Debug.Print Folder.Name
    If Folder.Name = FldrName Then
        Folder.Delete
        Exit For
    End If
Next

结束函数

子测试() Delete_Folder "子文件夹名称" 结束子

【讨论】:

  • 这假设只有一级深度
【解决方案2】:

OP 说他们想“不使用FSO”重写他们的代码,但这没有意义。

如果目标是减少代码量,只需将其设为单行

CreateObject("Scripting.FileSystemObject").DeleteFolder "x:\myFolder"

根据要求,此永久会删除文件夹其中的内容。


更多信息:

【讨论】:

  • 1.多平台解决方案 2. 如果有人要编写自己的文件类,他也可以实现 .DeleteFolder 方法:在这种情况下使用也将是“单线”。
【解决方案3】:

这段代码使用 RmDir 删除文件夹。 AFAIK,RmDir 不能删除文件夹,除非它是空的,所以我们先清除文件夹中的内容然后删除目录。

Private Sub PrepareDirModified(dirStr As String)
On Error Resume Next
    If Right(dirStr, 1) <> "\" Then dirStr = dirStr & "\"
    Kill dirStr & "*.*" 
    RmDir dirStr
    MkDir dirStr
On Error GoTo 0
End Sub

希望这会有所帮助。

【讨论】:

  • 您可能想尝试添加检查文件夹是否已经为空,因为如果它为空,Kill 将导致not found 错误。跨度>
  • @Ans: On Error Resume Next 会导致这个错误被忽略
  • 我有点怀疑如果目录中有目录,它会递归地工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多