我创建了一个临时文件夹,稍后会在程序中使用以下代码删除:
'Creates a new temporary directory path for a folder copy
If dir("C:\\InventorTempFolder\\\", vbDirectory) = "" Then
MkDir "C:\\InventorTempFolder\\\"
SetAttr "C:\InventorTempFolder", vbNormal
Else: MsgBox "This folder already exists."
End If
(我不知道SetAttr是否正确......这是我提问的一部分!)
然后我将此代码拉到离线状态,应使用以下代码删除此文件夹中的所有文件和目录:
Sub DeleteDirectory()
Dim dir_name As String
Dim file_name As String
Dim files As Collection
Dim i As Integer
dir_name = "C:\\InventorTempFolder"
' Get a list of files it contains.
Set files = New Collection
file_name = dir$(dir_name & "\*.*", vbReadOnly + _
vbHidden + vbSystem + vbDirectory)
Do While Len(file_name) > 0
If (file_name <> "..") And (file_name <> ".") Then
files.Add dir_name & "\" & file_name
End If
file_name = dir$()
Loop
' Delete the files.
For i = 1 To files.Count
file_name = files(i)
' See if it is a directory.
If GetAttr(file_name) = vbDirectory Then
Kill file_name
Else: Kill file_name
End If
Next i
' The directory is now empty. Delete it.
RmDir dir_name
' Remove the read-only flag if set.
' (Thanks to Ralf Wolter.)
End Sub
但是,目录不会删除。我的理论是,这是因为该目录是一个只读文件夹。这就是为什么我试图将属性更改为vbNormal,但它不会改变。所以我想知道的问题是:
为什么不删除?我的理论是正确的,因为它是只读的吗?
如果是这样,我该如何解决?
如果没有,还有什么问题......?
提前致谢!
答案 0 :(得分:2)
脚本的结尾是:
RmDir dir_name
' Remove the read-only flag if set.
' (Thanks to Ralf Wolter.)
RmDir dir_name
所以你试图两次删除同一个目录。此时dir_name
设置为“SillyVBA”目录 - 当我测试时,确实会被删除。我假设第二个RmDir
意味着删除“C:\ InventorTempFolder”;当我测试它时,这对我也有用。
更新以回复评论
问题可能是由于您尝试在文件类型为目录时使用Kill
。要进行完全递归删除,您需要从树的底部开始,删除所有文件和空目录。但是更简单的方法是使用FileSystemObject:
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
fso.deletefolder dir_name
这将一次性删除目录及其中的所有内容。