回 帖 发 新 帖 刷新版面

主题:[讨论]最近VB版太冷清了,发个用mkDir创建多级目录的函数,以纪念行将就木的VB6

最近VB版太冷清了,发个用mkDir创建多级目录的函数,以纪念行将就木的VB6
[code=c]
Private Function MkDirEx(ByVal strFolder As String) As Long
On Error GoTo errHandler
Dim i As Integer
Dim folders As Variant
Dim n As Integer
Dim strTmp As String
'strFolder = Replace$(strFolder & "\", "\\", "\")       ' "\\" is also a valid path in windows
strTmp = Left$(strFolder, InStr(1, strFolder, ":"))
folders = Split(Right$(strFolder, Len(strFolder) - Len(strTmp)), "\")
n = UBound(folders)
For i = 0 To n
    If Len(Dir$(strTmp, vbDirectory)) = 0 Then
        MkDir$ strTmp
    End If
    strTmp = strTmp & "\" & folders(i)
Next
MkDirEx = 0
Exit Function
errHandler:
    Debug.Print Err.Description
    MkDirEx = -1
End Function
[/code]

回复列表 (共9个回复)

沙发

可以试下这个API:SHCreateDirectory

板凳

高手就是不一样!
我这里的API浏览器里只有SHCreateDirectoryEx
Private Declare Function SHCreateDirectoryEx Lib "SHELL32.DLL" (ByVal hwnd As Long, ByVal pszPath As String, ByRef psa As SECURITY_ATTRIBUTES) As Long

3 楼

呵呵,高手不敢当,就是个代码写得比较多的coder而已

SHCreateDirectoryEx比SHCreateDirectory多了个后面的参数,用于权限方面的,一般我们用不到.

Private Declare Function SHCreateDirectory Lib "SHELL32.DLL" (ByVal hwnd As Long, ByVal pszPath As String) As Long


SHCreateDirectory Function

--------------------------------------------------------------------------------

Creates a folder.

Syntax

int SHCreateDirectory(          HWND hwnd,
    LPCWSTR pszPath
);
Parameters

hwnd
[in] A handle to a parent window. This parameter can be set to NULL if no user interface is displayed.
pszPath
[in] A pointer to a null-terminated Unicode string that contains the fully-qualified path of the directory. This string should have no more than MAX_PATH characters, including the terminating NULL character.
Return Value

Returns ERROR_SUCCESS if successful. If the operation fails, it returns one of the following error codes.

ERROR_BAD_PATHNAME The pszPath parameter was set to a relative path. 
ERROR_FILENAME_EXCED_RANGE The path pointed to by pszPath is too long. 
ERROR_FILE_EXISTS The directory exists. 
ERROR_ALREADY_EXISTS The directory exists. 
ERROR_CANCELLED The user canceled the operation. 


Remarks

Note  This function is available through Microsoft Windows XP Service Pack 2 (SP2) and Windows Server 2003. It might be altered or unavailable in subsequent versions of Windows.
This function creates a file system folder whose fully-qualified path is given by pszPath. If one or more of the intermediate folders do not exist, it creates them.

To set security attributes on a new folder, use SHCreateDirectoryEx.

Function Information

Minimum DLL Version shell32.dll version 5.0 or later 
Custom Implementation No 
Header shlobj.h 
Import library shell32.lib 

Minimum operating systems Windows 2000 

4 楼

刚仔细看了下MSDN,原来SHCreateDirectory只有UNICODE版本,有几个解决方案:

1) SHCreateDirectoryEx + ANSI
Private Declare Function SHCreateDirectoryEx Lib "SHELL32.DLL" Alias "SHCreateDirectoryExA" (ByVal hwnd As Long, ByVal pszPath As String, ByVal psa As Long) As Long

ret = SHCreateDirectoryEx(0, "D:\abc\def\ghi", 0)

2) 用类型库声明, 有点复杂, 略过

3) SHCreateDirectory/SHCreateDirectoryEx + UNICODE
Private Declare Function SHCreateDirectory Lib "SHELL32.DLL" (ByVal hwnd As Long, ByVal pszPath As Long) As Long

Private Declare Function SHCreateDirectoryEx Lib "SHELL32.DLL" Alias "SHCreateDirectoryExW" (ByVal hwnd As Long, ByVal pszPath As Long, ByVal psa As Long) As Long

Const PATH As String = "D:\abc\def\ghi"
Call SHCreateDirectory(0, StrPtr(PATH))
'Call SHCreateDirectoryEx(0, StrPtr(PATH), 0)

5 楼

对于SHCreateDirectory,
MSDN上说
This function is available through Windows XP Service Pack 2 (SP2) and Microsoft Windows Server 2003. It might be altered or unavailable in subsequent versions of Windows。

This function has indeed been dropped from Windows Vista. Use SHCreateDirectoryEx instead

还是用Ex的版本保险些。

6 楼

[quote]Note  This function is available through Microsoft Windows XP Service Pack 2 (SP2) and Windows Server 2003. It might be altered or unavailable in subsequent versions of Windows.[/quote]
SHCreateDirectoryEx 也有这个Note

不知道微软为什么写这个Note,不过在Vista上还是有这两个函数的.


[quote]This function has indeed been dropped from Windows Vista[/quote]
你看到的是哪个版本的MSDN,我在官网上看到的MSDN没有这个的? 
我的系统是vista,还有这个函数
[url]http://msdn.microsoft.com/en-us/library/bb762130(VS.85).aspx[/url]

微软的兼容性方面做得很好,一般是不会撤掉以前公布的API的,有些win3x的函数都还能找得到.

7 楼

http://msdn.microsoft.com/en-us/library/bb762130(VS.85).aspx
就在最底部的

8 楼

那个是别人写的留言评论,呵呵,你看下'SHCreateDirectoryEx' 下面有
[quote]error C2065: 'SHCreateDirectoryEx' : undeclared identifier[/quote]
这些是非官方的.谁的可以去修改

9 楼

哦,原来如此。。3Q

我来回复

您尚未登录,请登录后再回复。点此登录或注册