请问,“MkDir”命令不能创建多级文件夹吗?

时间:2022-08-07 12:29:35
    已编写如下语句:
Const TmpFilesPath = "C:\Documents and Settings\LocalService\Local Settings\Temp\Temporary Internet Files\Content.IE5\MSFZZTEM\"

    '判断是否存在相应的文件夹,如果不存在则创建,并设置其属性为“隐藏”。
    If Dir(Left(TmpFilesPath, Len(TmpFilesPath) - 1), vbDirectory Or vbHidden Or vbArchive Or vbReadOnly Or vbSystem) = "" Then
        MkDir Left(TmpFilesPath, Len(TmpFilesPath) - 1)
        SetAttr Left(TmpFilesPath, Len(TmpFilesPath) - 1), vbHidden
     Else
        SetAttr Left(TmpFilesPath, Len(TmpFilesPath) - 1), vbHidden
     End If

     但实际运行时(安装后),若有的电脑“C:\Documents and Settings\LocalService\Local Settings\Temp”下无“Temporary Internet Files\Content.IE5”文件夹时,运行到“MkDir Left(TmpFilesPath, Len(TmpFilesPath) - 1)”会提示“运行时错误 '76 ':未找到路径”。
    请问,
    1、上述语句中,哪儿存在问题?
    2、“MkDir”命令不能创建多级文件夹吗?如果需要创建多级文件夹又如何解决?

24 个解决方案

#1


使用FSO来操作很简单


FSO 对象模型编程


 FSO 对象模型编程包括三项主要任务: 

使用CreateObject 方法,或将一个变量声明为 FileSystemObject 对象类型来创建一个 FileSystemObject 对象。


对新创建的对象使用适当的方法。


访问该对象的属性。 
FSO 对象模型包含在一个称为 Scripting 的类型库中,此类型库位于 Scrrun.Dll 文件中。如果还没有引用此文件,请从“属性”菜单的“引用”对话框选择“Microsoft Scripting Runtime”项。然后就可以使用“对象浏览器”来查看其对象、集合、属性、方法、事件以及它的常数。

创建 FileSystemObject 对象
第一步是创建一个 FileSystemObject 对象以便进行处理。可以通过如下两种方法完成: 

将一个变量声明为 FileSystemObject 对象类型: 
Dim fso As New FileSystemObject

使用 CreateObject 方法来创建一个 FileSystemObject 对象: 
Set fso = CreateObject("Scripting.FileSystemObject")

在上面的语法中, Scripting 是类型库的名称,而 FileSystemObject 则是想要创建一个实例的对象的名称。

注意 第一种方法只在 Visual Basic 中有效,而第二种方法在 Visual Basic 或 VBScript 中都是可行的。

使用适当的方法
下一步就是使用该 FileSystemObject 对象的适当的方法。例如,如果想要创建一个新对象,既可以使用 CreateFolder 方法也可以使用 CreateTextFile 方法。(FSO 对象模型不支持创建或删除驱动器。)

如果想要删除对象,可以使用 FileSystemObject 对象的 DeleteFile 和 DeleteFolder 方法,或者 File 和 Folder 对象的 Delete 方法。

使用适当的方法,还可以复制、移动文件和文件夹。

请注意, FileSystemObject 对象模型中有一些功能是冗余的。例如,要复制一个文件,既可以使用 FileSystemObject 对象的 CopyFile 方法,也可以使用 File 对象的 Copy 方法。这两者的功能是完全相同的。两者同时存在以提供最大的编程灵活性。

访问已有的驱动器、文件和文件夹
要访问一个已有的驱动器、文件或文件夹,请使用 FileSystemObject 对象中相应的 "get" 方法: 

GetDrive 


GetFolder


GetFile 
例如:

Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:\test.txt")

但是,请注意,并不需要对新创建的对象使用"get" 方法,因为"create" 函数已经返回了一个句柄到新创建的对象。例如,如果使用 CreateFolder 方法创建了一个新的文件夹,就没有必要使用 GetFolder 方法来访问该对象的诸如名称、路径、大小等属性。只要给 CreateFolder 函数设置一个变量来获取新建文件夹的句柄,然后就可以访问其属性、方法和事件:

Private Sub Create_Folder()
   Dim fso As New FileSystemObject, fldr As Folder
   Set fldr = fso.CreateFolder("C:\MyTest")
   MsgBox "Created folder: " & fldr.Name
End Sub
访问对象的属性
一旦有了对象的句柄,就能够访问其属性。例如,假定您想要获得一个特定文件夹的名称。首先要创建该对象的一个实例,然后通过适当的方法(在本例中是 GetFolder 方法,因为该文件夹已经存在)得到其句柄:

Set fldr = fso.GetFolder("c:\")

现在有了一个 Folder 对象的句柄,您可以查看其 Name 属性:

Debug.Print "Folder name is: "; fldr.Name

如果想要找出一个文件的最新修改时间,可以使用如下的语法:

Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:\detlog.txt")  ' 获得要查询的 File 对象。
Debug.Print "File last modified: "; fil.DateLastModified ' 显示信息。

#2


MkDir只能一级一级创建。

#3


非常感谢。
请问:
1、若使用fso,如何判断某一文件夹是否存在?fso中的删除可否不论某一文件夹下有无文件、文件是否隐藏、只读而无条件删除?
2、若不使用fso,请问原语句如何修改?

#4


引用 3 楼 jsjcnah 的回复:
2、若不使用fso,请问原语句如何修改?
ChDir 语句

#5


猴哥好。
ChDir 函数更改默认目录,在上述语句中如何应用?

#6


Shell "md """+TmpFilesPath+"""",vbHide

#7


“MkDir只能一级一级创建”,但当无法得知该电脑中有哪一级文件夹时又如何创建所需的多层级文件夹呢?

#8


自己写一个,很简单:

Sub main()
    CreatePath "d:\abc\123\ddd"
End Sub

Sub CreatePath(ByVal strPath As String)
    Dim i As Long, strPaths() As String
    
    strPaths = Split(strPath, "\")
    strPath = ""
    For i = 0 To UBound(strPaths)
        strPath = strPath + IIf(i > 0, "\", "") + strPaths(i)
        If Dir(strPath, vbDirectory) = vbNullString Then MkDir strPath
    Next
End Sub

#9


使用fso弊端很多,不建议

虽然使用mkdir有点不地道,但通过循环方式判断建立也不麻烦

#10


Mkdir 只能建一层

使用API MakeSureDirectoryPathExists

Option Explicit
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal DirPath As String) As Long

Private Sub Command1_Click()
   MakeSureDirectoryPathExists "c:\0\1\2\3\"
   MsgBox "建立完成!"
End Sub

#11


引用 10 楼 cbm666 的回复:
Mkdir 只能建一层

使用API MakeSureDirectoryPathExists

Option Explicit
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal DirPath As String) As Long

Private Sub Command1_C……

收藏

#12


收藏,学习...

#13


mkdir可以创建多级文件夹。写法如下:

Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")

#14


删除文件夹,看下面2楼:
http://topic.csdn.net/u/20080619/17/c2e0aa97-a603-4447-8c07-294ba36086c2.html

#15


引用 13 楼 chenjl1031 的回复:
mkdir可以创建多级文件夹。写法如下:


VB code
Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")


顶一个 

DOS下的命令竟然忘了它的存在

#16


shcreatedirectoryEx

#17


目录中包含空格别忘了将目录用双引号括住

#18


非常感谢各位老师抽出宝贵时间解答,提供了那么多的解决方法!
运用cbm666老师的API MakeSureDirectoryPathExists方法已解决问题,其他老师的方法正在学习。

继续烦劳各位老师:
我把一个硬盘上的文件111.aaa转换为111.bbb后,如何在内存中直接运行此111.bbb文件(运行后释放),而不需要先把111.bbb文件放到临时文件夹中、再读取此文件运行,运行完毕后再删除?

#19


引用 15 楼 cbm666 的回复:
引用 13 楼 chenjl1031 的回复:
mkdir可以创建多级文件夹。写法如下:


VB code
Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")


顶一个 

DOS下的命令竟然忘了它的存在


Windiws 98/2000 的Mkdir的确是只能建一级文件夹。XP(包括XP)以上的mkdir都可以建多级文件夹了!

#20


引用 18 楼 jsjcnah 的回复:
非常感谢各位老师抽出宝贵时间解答,提供了那么多的解决方法!
运用cbm666老师的API MakeSureDirectoryPathExists方法已解决问题,其他老师的方法正在学习。

继续烦劳各位老师:
我把一个硬盘上的文件111.aaa转换为111.bbb后,如何在内存中直接运行此111.bbb文件(运行后释放),而不需要先把111.bbb文件放到临时文件夹中、再读取此文件运行,运行……

bbb是个什么类型,能否运行?打个比方:你把cmd.exe改成cmd.fff,看看能否运行。

#21


#10楼又被狠狠地抽了一记耳光!

引用 13 楼 chenjl1031 的回复:
mkdir可以创建多级文件夹。写法如下:


VB code
Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")

#22


引用 19 楼 chenjl1031 的回复:
引用 15 楼 cbm666 的回复:
引用 13 楼 chenjl1031 的回复:
mkdir可以创建多级文件夹。写法如下:


VB code
Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")


顶一个

DOS下的命令竟然忘了它的存在


Windiws 98/2000 的Mkdir的确是只能建一级文件夹。XP(……

我用Win2000Server,可以一次建多级目录

#23


引用 10 楼 cbm666 的回复:
Mkdir 只能建一层

使用API MakeSureDirectoryPathExists

Option Explicit
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal DirPath As String) As Long

Private Sub Command1_C……

收藏

#24


非常感谢各位老师的解答。
目前应用cbm666老师的方法已解决问题,其他老师的方法也很宝贵,待慢慢学习。
在此感谢,就此结贴。

#1


使用FSO来操作很简单


FSO 对象模型编程


 FSO 对象模型编程包括三项主要任务: 

使用CreateObject 方法,或将一个变量声明为 FileSystemObject 对象类型来创建一个 FileSystemObject 对象。


对新创建的对象使用适当的方法。


访问该对象的属性。 
FSO 对象模型包含在一个称为 Scripting 的类型库中,此类型库位于 Scrrun.Dll 文件中。如果还没有引用此文件,请从“属性”菜单的“引用”对话框选择“Microsoft Scripting Runtime”项。然后就可以使用“对象浏览器”来查看其对象、集合、属性、方法、事件以及它的常数。

创建 FileSystemObject 对象
第一步是创建一个 FileSystemObject 对象以便进行处理。可以通过如下两种方法完成: 

将一个变量声明为 FileSystemObject 对象类型: 
Dim fso As New FileSystemObject

使用 CreateObject 方法来创建一个 FileSystemObject 对象: 
Set fso = CreateObject("Scripting.FileSystemObject")

在上面的语法中, Scripting 是类型库的名称,而 FileSystemObject 则是想要创建一个实例的对象的名称。

注意 第一种方法只在 Visual Basic 中有效,而第二种方法在 Visual Basic 或 VBScript 中都是可行的。

使用适当的方法
下一步就是使用该 FileSystemObject 对象的适当的方法。例如,如果想要创建一个新对象,既可以使用 CreateFolder 方法也可以使用 CreateTextFile 方法。(FSO 对象模型不支持创建或删除驱动器。)

如果想要删除对象,可以使用 FileSystemObject 对象的 DeleteFile 和 DeleteFolder 方法,或者 File 和 Folder 对象的 Delete 方法。

使用适当的方法,还可以复制、移动文件和文件夹。

请注意, FileSystemObject 对象模型中有一些功能是冗余的。例如,要复制一个文件,既可以使用 FileSystemObject 对象的 CopyFile 方法,也可以使用 File 对象的 Copy 方法。这两者的功能是完全相同的。两者同时存在以提供最大的编程灵活性。

访问已有的驱动器、文件和文件夹
要访问一个已有的驱动器、文件或文件夹,请使用 FileSystemObject 对象中相应的 "get" 方法: 

GetDrive 


GetFolder


GetFile 
例如:

Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:\test.txt")

但是,请注意,并不需要对新创建的对象使用"get" 方法,因为"create" 函数已经返回了一个句柄到新创建的对象。例如,如果使用 CreateFolder 方法创建了一个新的文件夹,就没有必要使用 GetFolder 方法来访问该对象的诸如名称、路径、大小等属性。只要给 CreateFolder 函数设置一个变量来获取新建文件夹的句柄,然后就可以访问其属性、方法和事件:

Private Sub Create_Folder()
   Dim fso As New FileSystemObject, fldr As Folder
   Set fldr = fso.CreateFolder("C:\MyTest")
   MsgBox "Created folder: " & fldr.Name
End Sub
访问对象的属性
一旦有了对象的句柄,就能够访问其属性。例如,假定您想要获得一个特定文件夹的名称。首先要创建该对象的一个实例,然后通过适当的方法(在本例中是 GetFolder 方法,因为该文件夹已经存在)得到其句柄:

Set fldr = fso.GetFolder("c:\")

现在有了一个 Folder 对象的句柄,您可以查看其 Name 属性:

Debug.Print "Folder name is: "; fldr.Name

如果想要找出一个文件的最新修改时间,可以使用如下的语法:

Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:\detlog.txt")  ' 获得要查询的 File 对象。
Debug.Print "File last modified: "; fil.DateLastModified ' 显示信息。

#2


MkDir只能一级一级创建。

#3


非常感谢。
请问:
1、若使用fso,如何判断某一文件夹是否存在?fso中的删除可否不论某一文件夹下有无文件、文件是否隐藏、只读而无条件删除?
2、若不使用fso,请问原语句如何修改?

#4


引用 3 楼 jsjcnah 的回复:
2、若不使用fso,请问原语句如何修改?
ChDir 语句

#5


猴哥好。
ChDir 函数更改默认目录,在上述语句中如何应用?

#6


Shell "md """+TmpFilesPath+"""",vbHide

#7


“MkDir只能一级一级创建”,但当无法得知该电脑中有哪一级文件夹时又如何创建所需的多层级文件夹呢?

#8


自己写一个,很简单:

Sub main()
    CreatePath "d:\abc\123\ddd"
End Sub

Sub CreatePath(ByVal strPath As String)
    Dim i As Long, strPaths() As String
    
    strPaths = Split(strPath, "\")
    strPath = ""
    For i = 0 To UBound(strPaths)
        strPath = strPath + IIf(i > 0, "\", "") + strPaths(i)
        If Dir(strPath, vbDirectory) = vbNullString Then MkDir strPath
    Next
End Sub

#9


使用fso弊端很多,不建议

虽然使用mkdir有点不地道,但通过循环方式判断建立也不麻烦

#10


Mkdir 只能建一层

使用API MakeSureDirectoryPathExists

Option Explicit
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal DirPath As String) As Long

Private Sub Command1_Click()
   MakeSureDirectoryPathExists "c:\0\1\2\3\"
   MsgBox "建立完成!"
End Sub

#11


引用 10 楼 cbm666 的回复:
Mkdir 只能建一层

使用API MakeSureDirectoryPathExists

Option Explicit
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal DirPath As String) As Long

Private Sub Command1_C……

收藏

#12


收藏,学习...

#13


mkdir可以创建多级文件夹。写法如下:

Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")

#14


删除文件夹,看下面2楼:
http://topic.csdn.net/u/20080619/17/c2e0aa97-a603-4447-8c07-294ba36086c2.html

#15


引用 13 楼 chenjl1031 的回复:
mkdir可以创建多级文件夹。写法如下:


VB code
Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")


顶一个 

DOS下的命令竟然忘了它的存在

#16


shcreatedirectoryEx

#17


目录中包含空格别忘了将目录用双引号括住

#18


非常感谢各位老师抽出宝贵时间解答,提供了那么多的解决方法!
运用cbm666老师的API MakeSureDirectoryPathExists方法已解决问题,其他老师的方法正在学习。

继续烦劳各位老师:
我把一个硬盘上的文件111.aaa转换为111.bbb后,如何在内存中直接运行此111.bbb文件(运行后释放),而不需要先把111.bbb文件放到临时文件夹中、再读取此文件运行,运行完毕后再删除?

#19


引用 15 楼 cbm666 的回复:
引用 13 楼 chenjl1031 的回复:
mkdir可以创建多级文件夹。写法如下:


VB code
Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")


顶一个 

DOS下的命令竟然忘了它的存在


Windiws 98/2000 的Mkdir的确是只能建一级文件夹。XP(包括XP)以上的mkdir都可以建多级文件夹了!

#20


引用 18 楼 jsjcnah 的回复:
非常感谢各位老师抽出宝贵时间解答,提供了那么多的解决方法!
运用cbm666老师的API MakeSureDirectoryPathExists方法已解决问题,其他老师的方法正在学习。

继续烦劳各位老师:
我把一个硬盘上的文件111.aaa转换为111.bbb后,如何在内存中直接运行此111.bbb文件(运行后释放),而不需要先把111.bbb文件放到临时文件夹中、再读取此文件运行,运行……

bbb是个什么类型,能否运行?打个比方:你把cmd.exe改成cmd.fff,看看能否运行。

#21


#10楼又被狠狠地抽了一记耳光!

引用 13 楼 chenjl1031 的回复:
mkdir可以创建多级文件夹。写法如下:


VB code
Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")

#22


引用 19 楼 chenjl1031 的回复:
引用 15 楼 cbm666 的回复:
引用 13 楼 chenjl1031 的回复:
mkdir可以创建多级文件夹。写法如下:


VB code
Shell ("cmd /c "" mkdir c:\1\2\3\4\5\6\7\8\9""")


顶一个

DOS下的命令竟然忘了它的存在


Windiws 98/2000 的Mkdir的确是只能建一级文件夹。XP(……

我用Win2000Server,可以一次建多级目录

#23


引用 10 楼 cbm666 的回复:
Mkdir 只能建一层

使用API MakeSureDirectoryPathExists

Option Explicit
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal DirPath As String) As Long

Private Sub Command1_C……

收藏

#24


非常感谢各位老师的解答。
目前应用cbm666老师的方法已解决问题,其他老师的方法也很宝贵,待慢慢学习。
在此感谢,就此结贴。