如何用VB获得Windows各类系统目录

时间:2022-06-17 08:29:50

现在有很多关于如何用VB获得Windows目 录的文章,但大都只讲到如何获得Windows目录和System目录,有时候我们却需要获得像"我的文档"这样的目录("我的文档"的路径并不是固定 的,可以由自己设定,也有可能因为系统的安装路径不同而不同),那又该如何处理呢?下面我们来具体谈谈如何用VB获得这种路径。
  先向大家介绍两个API函数,这两个函数分别是SHGetSpecialFolderLocation和SHGetPathFromIDList,这就是我们用来获得各种路径的武器。
函数声明:
Private
Declare Function SHGetSpecialFolderLocation Lib "Shell32" (ByVal
hwndOwner As Long, ByVal nFolder As Integer, ppidl As Long) As Long
Private
Declare Function SHGetPathFromIDList Lib "Shell32" Alias
"SHGetPathFromIDListA" (ByVal pidl As Long, ByVal szPath As String) As
Long

函数功能及参数说明:
SHGetSpecialFolderLocation:获得某个特殊目录在特殊目录列表中的位置;它有三个参数,第一个参数是用来指定所有者窗口的,在应用中一般我们写上"0"就可以了;第二个参数是一个整数id,它决定要查找的目录是哪一个目录,它的取值可能如下:
&H0& '桌面
&H2& '程序集
&H5& '我的文档
&H6& '收藏夹
&H7& '启动
&H8& '最近打开的文件
&H9& '发送
&HB& '开始菜单
&H13& '网上邻居
&H14& '字体
&H15& 'ShellNew
&H1A& 'Application Data
&H1B& 'PrintHood
&H20& '网页临时文件
&H21& 'Cookies目录
&H22& '历史
第三个参数是获得的特殊目录在特殊目录列表中的地址。

SHGetPathFromIDList:根据某特殊目录在特殊目录列表中的地址获取该目录的准确路径。它有两个参数,第一个参数是特殊目录在特殊目录列表中的地址,也即上一个函数所获得的地址;第二个参数是一个字符串型数据,用来保存返回的特殊目录的准确路径。
比如:为了获得DeskTop的路径,首先需调用SHGetSpecialFolderLocation获得DeskTop在特殊目录列表中的位置Pid,然后调用SHGetPathFromIDList函数获得Pid指向的列表内容,即DeskTop的准确路径。

下面是我编写的一个用来获取Windows各种目录路径的例子,供大家参考。如果您有什么问题或建议,欢迎给我来信(xuhaoliang@21cn.com)。

程序代码如下:
Private
Declare Function SHGetSpecialFolderLocation Lib "Shell32" (ByVal
hwndOwner As Long, ByVal nFolder As Integer, ppidl As Long) As Long
Private
Declare Function SHGetPathFromIDList Lib "Shell32" Alias
"SHGetPathFromIDListA" (ByVal pidl As Long, ByVal szPath As String) As
Long
Private Declare Function GetWindowsDirectory Lib "kernel32"
Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As
Long) As Long
Private Declare Function GetSystemDirectory Lib
"kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal
nSize As Long) As Long
Private Declare Function GetTempPath Lib
"kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal
lpBuffer As String) As Long
Const MAX_LEN = 200 '字符串最大长度
Const DESKTOP = &H0& '桌面
Const PROGRAMS = &H2& '程序集
Const MYDOCUMENTS = &H5& '我的文档
Const MYFAVORITES = &H6& '收藏夹
Const STARTUP = &H7& '启动
Const RECENT = &H8& '最近打开的文件
Const SENDTO = &H9& '发送
Const STARTMENU = &HB& '开始菜单
Const NETHOOD = &H13& '网上邻居
Const FONTS = &H14& '字体
Const SHELLNEW = &H15& 'ShellNew
Const APPDATA = &H1A& 'Application Data
Const PRINTHOOD = &H1B& 'PrintHood
Const PAGETMP = &H20& '网页临时文件
Const COOKIES = &H21& 'Cookies目录
Const HISTORY = &H22& '历史

Private Sub Command2_Click()
End
End Sub

Private Sub Form_Load()
Dim sTmp As String * MAX_LEN  '存放结果的固定长度的字符串
Dim nLength As Long  '字符串的实际长度
Dim pidl As Long  '某特殊目录在特殊目录列表中的位置
'*************************获得Windows目录**********************************
Length = GetWindowsDirectory(sTmp, MAX_LEN)
txtWin.Text = Left(sTmp, Length)
'*************************获得System目录***********************************
Length = GetSystemDirectory(sTmp, MAX_LEN)
txtSystem.Text = Left(sTmp, Length)
'*************************获得Temp目录***********************************
Length = GetTempPath(MAX_LEN, sTmp)
txtTemp.Text = Left(sTmp, Length)
'*************************获得DeskTop目录**********************************
SHGetSpecialFolderLocation 0, DESKTOP, pidl
SHGetPathFromIDList pidl, sTmp
txtDesktop.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得发送到目录**********************************
SHGetSpecialFolderLocation 0, SENDTO, pidl
SHGetPathFromIDList pidl, sTmp
txtSendTo.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得我的文档目录*********************************
SHGetSpecialFolderLocation 0, MYDOCUMENTS, pidl
SHGetPathFromIDList pidl, sTmp
txtDocument.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得程序集目录***********************************
SHGetSpecialFolderLocation 0, PROGRAMS, pidl
SHGetPathFromIDList pidl, sTmp
txtProgram.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得启动目录*************************************
SHGetSpecialFolderLocation 0, STARTUP, pidl
SHGetPathFromIDList pidl, sTmp
txtStart.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得开始菜单目录*********************************
SHGetSpecialFolderLocation 0, STARTMENU, pidl
SHGetPathFromIDList pidl, sTmp
txtStartMenu.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得收藏夹目录***********************************
SHGetSpecialFolderLocation 0, MYFAVORITES, pidl
SHGetPathFromIDList pidl, sTmp
txtFavorites.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'**********************获得最后打开的文件目录*******************************
SHGetSpecialFolderLocation 0, RECENT, pidl
SHGetPathFromIDList pidl, sTmp
txtRecent.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得网上邻居目录*********************************
SHGetSpecialFolderLocation 0, NETHOOD, pidl
SHGetPathFromIDList pidl, sTmp
txtNetHood.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得字体目录**********************************
SHGetSpecialFolderLocation 0, FONTS, pidl
SHGetPathFromIDList pidl, sTmp
txtFonts.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得Cookies目录**********************************
SHGetSpecialFolderLocation 0, COOKIES, pidl
SHGetPathFromIDList pidl, sTmp
txtCookies.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得历史目录**********************************
SHGetSpecialFolderLocation 0, HISTORY, pidl
SHGetPathFromIDList pidl, sTmp
txtHistory.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'***********************获得网页临时文件目录*******************************
SHGetSpecialFolderLocation 0, PAGETMP, pidl
SHGetPathFromIDList pidl, sTmp
txtPageTmp.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得ShellNew目录*********************************
SHGetSpecialFolderLocation 0, SHELLNEW, pidl
SHGetPathFromIDList pidl, sTmp
txtShellNew.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'***********************获得Application Data目录*****************************
SHGetSpecialFolderLocation 0, APPDATA, pidl
SHGetPathFromIDList pidl, sTmp
txtAppData.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
'*************************获得PrintHood目录*********************************
SHGetSpecialFolderLocation 0, PRINTHOOD, pidl
SHGetPathFromIDList pidl, sTmp
txtPrintHood.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
End Sub

获取系统各种文件夹路径

'使用方法
'调用函数GetSpecialPath(参数)
'例1:msgbox GetSpecialPath(CSIDL_font) & "\"              (返回系统字体的文件夹)
'例2:msgbox GetSpecialPath(CSIDL_Users_FAVORITES) & "\"   (返回当前用户收藏夹)
'例3:msgbox GetSpecialPath(CSIDL_Users_Pictures) & "\"    (返回当前用户-图片收藏)
'例4:msgbox GetSpecialPath(CSIDL_AllUsers_FAVORITES) & "\"(返回共享收藏夹)
'例5:msgbox GetSpecialPath(CSIDL_Users_MyDocuments) & "\" (返回当前用户-我的文档)
Option Explicit
Private Const NOERROR = 0
Private Const CSIDL_Users_FAVORITES = &H6 '当前用户\收藏夹
Private Const CSIDL_Users_DESKTOPDIRECTORY = &H10 '当前用户\桌面
Private Const CSIDL_Users_STARTMENU = &HB '当前用户\开始菜单
Private Const CSIDL_Users_STARTMENU_cx = &H2 '当前用户\开始-程序
Private Const CSIDL_Users_MyDocuments = &H5 '当前用户\我的文档
Private Const CSIDL_Users_STARTMENU_a = &H7 '当前用户\开始-程序-启动
Private Const CSIDL_Users_Recent = &H8 '当前用户\'Recent
Private Const CSIDL_Users_SendTo = &H9 '当前用户\SendTo
Private Const CSIDL_Users_MyMusic = &HD '当前用户\My Documents\My Music\
Private Const CSIDL_Users_NetHood = &H13 '当前用户\NetHood
Private Const CSIDL_Users_Templates = &H15 '当前用户\Templates
Private Const CSIDL_Users_AppData = &H1A '当前用户\Application Data\
Private Const CSIDL_Users_PrintHood = &H1B '当前用户\PrintHood\
Private Const CSIDL_Users_Local_AppData = &H1C '当前用户\Local Settings\Application Data\
Private Const CSIDL_Users_Temp = &H20 '当前用户\Local Settings\Temporary Internet Files\
Private Const CSIDL_Users_Cookies = &H21 '当前用户\Cookies\
Private Const CSIDL_Users_History = &H22 '当前用户\Local Settings\History\
Private Const CSIDL_Users_Pictures = &H27 '当前用户\My Documents\My Pictures\
Private Const CSIDL_Users = &H28 '当前用户\
Private Const CSIDL_Users_gl = &H30 '当前用户\「开始」菜单\程序\管理工具\
Private Const CSIDL_Users_CDBurning = &H3B '当前用户\Local Settings\Application Data\Microsoft\CD Burning\

Private Const CSIDL_AllUsers_STARTMENU = &H16 'All Users\「开始」菜单\
Private Const CSIDL_AllUsers_STARTMENU_cx = &H17 'All Users\「开始」菜单\程序\
Private Const CSIDL_AllUsers_STARTMENU_j = &H18 'All Users\「开始」菜单\程序\启动\
Private Const CSIDL_AllUsers_DESKTOPDIRECTORY = &H19 'All Users\桌面
Private Const CSIDL_AllUsers_FAVORITES = &H1F 'All Users\Favorites\(收藏夹)
Private Const CSIDL_AllUsers_Templates = &H2D 'All Users\Templates\
Private Const CSIDL_AllUsers_Documents = &H2E 'All Users\Documents\
Private Const CSIDL_AllUsers_gl = &H2F 'All Users\「开始」菜单\程序\管理工具\
Private Const CSIDL_AllUsers_Music = &H35 'All Users\Documents\My Music\
Private Const CSIDL_AllUsers_Pictures = &H36 'All Users\Documents\My Pictures\
Private Const CSIDL_AllUsers_Videos = &H37 'All Users\Documents\My Videos\
Private Const CSIDL_AllUsers_AppData = &H23 'All Users\Application Data\

Private Const CSIDL_WinDows = &H24 '系统安装路径 C:\WINDOWS\
Private Const CSIDL_WinSystem = &H25 '系统文件夹 C:\WINDOWS\system32\
Private Const CSIDL_ProgramFiles = &H26 '应用程序安装文件夹 C:\Program Files\
Private Const CSIDL__ProgramFiles_CommonFiles = &H2B 'C:\Program Files\Common Files\
Private Const CSIDL_WIN_Resources = &H38 'C:\WINDOWS\Resources\
Private Const CSIDL_font = &H14 '字体文件夹C:\WINDOWS\Fonts\
' 声明API函数
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias
"SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As
Long
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll"
(ByVal hwndOwner As Long, ByVal nFolder As Long, pidl As Long) As Long

Private Function GetSpecialPath(CSIDL As Long) As String
    Dim s As Long
    Dim path As String
    Dim pidl As Long
    '根据指定的文件夹获得pidl
    s = SHGetSpecialFolderLocation(Me.hWnd, CSIDL, pidl)
    If s = NOERROR Then ' 根据r的返回值判断是否有错误发生,如果没有错误就获取文件夹路径
        path = Space$(512)
        s = SHGetPathFromIDList(ByVal pidl, ByVal path)
        GetSpecialPath = Left$(path, InStr(path, Chr$(0)) - 1)
        Exit Function
    End If
    GetSpecialPath = ""
End Function

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

Private Declare Function
SHGetSpecialFolderLocation Lib "Shell32" (ByVal hwndOwner As Long, ByVal
nFolder As Integer, ppidl As Long) As Long
Private Declare Function SHGetPathFromIDList Lib "Shell32" Alias
"SHGetPathFromIDListA" (ByVal pidl As Long, ByVal szPath As String) As
Long
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias
"GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long)
As Long
Private Declare Function GetSystemDirectory Lib "kernel32" Alias
"GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As
Long
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA"
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Const MAX_LEN = 200              '字符串最大长度
Const DESKTOP = &H0&             '桌面
Const PROGRAMS = &H2&            '程序集
Const MYDOCUMENTS = &H5&         '我的文档
Const MYFAVORITES = &H6&         '收藏夹
Const STARTUP = &H7&             '启动
Const RECENT = &H8&              '最近打开的文件
Const SENDTO = &H9&              '发送
Const STARTMENU = &HB&           '开始菜单
Const NETHOOD = &H13&            '网上邻居
Const FONTS = &H14&              '字体
Const SHELLNEW = &H15&           'ShellNew
Const APPDATA = &H1A&            'Application Data
Const PRINTHOOD = &H1B&          'PrintHood
Const PAGETMP = &H20&            '网页临时文件
Const COOKIES = &H21&            'Cookies目录
Const HISTORY = &H22&            '历史

Private Sub Command2_Click()
    End
End Sub

Private Sub Form_Load()
    Dim sTmp As String * MAX_LEN '存放结果的固定长度的字符串
    Dim nLength As Long          '字符串的实际长度
    Dim pidl As Long             '某特殊目录在特殊目录列表中的位置
    '*************************获得Windows目录**********************************
    Length = GetWindowsDirectory(sTmp, MAX_LEN)
    txtWin.Text = Left(sTmp, Length)
    '*************************获得System目录***********************************
    Length = GetSystemDirectory(sTmp, MAX_LEN)
    txtSystem.Text = Left(sTmp, Length)
    '*************************获得Temp目录***********************************
    Length = GetTempPath(MAX_LEN, sTmp)
    txtTemp.Text = Left(sTmp, Length)
    '*************************获得DeskTop目录**********************************
    SHGetSpecialFolderLocation 0, DESKTOP, pidl
    SHGetPathFromIDList pidl, sTmp
    txtDesktop.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得发送到目录**********************************
    SHGetSpecialFolderLocation 0, SENDTO, pidl
    SHGetPathFromIDList pidl, sTmp
    txtSendTo.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得我的文档目录*********************************
    SHGetSpecialFolderLocation 0, MYDOCUMENTS, pidl
    SHGetPathFromIDList pidl, sTmp
    txtDocument.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得程序集目录***********************************
    SHGetSpecialFolderLocation 0, PROGRAMS, pidl
    SHGetPathFromIDList pidl, sTmp
    txtProgram.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得启动目录*************************************
    SHGetSpecialFolderLocation 0, STARTUP, pidl
    SHGetPathFromIDList pidl, sTmp
    txtStart.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得开始菜单目录*********************************
    SHGetSpecialFolderLocation 0, STARTMENU, pidl
    SHGetPathFromIDList pidl, sTmp
    txtStartMenu.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得收藏夹目录***********************************
    SHGetSpecialFolderLocation 0, MYFAVORITES, pidl
    SHGetPathFromIDList pidl, sTmp
    txtFavorites.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '**********************获得最后打开的文件目录*******************************
    SHGetSpecialFolderLocation 0, RECENT, pidl
    SHGetPathFromIDList pidl, sTmp
    txtRecent.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得网上邻居目录*********************************
    SHGetSpecialFolderLocation 0, NETHOOD, pidl
    SHGetPathFromIDList pidl, sTmp
    txtNetHood.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得字体目录**********************************
    SHGetSpecialFolderLocation 0, FONTS, pidl
    SHGetPathFromIDList pidl, sTmp
    txtFonts.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得Cookies目录**********************************
    SHGetSpecialFolderLocation 0, COOKIES, pidl
    SHGetPathFromIDList pidl, sTmp
    txtCookies.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得历史目录**********************************
    SHGetSpecialFolderLocation 0, HISTORY, pidl
    SHGetPathFromIDList pidl, sTmp
    txtHistory.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '***********************获得网页临时文件目录*******************************
    SHGetSpecialFolderLocation 0, PAGETMP, pidl
    SHGetPathFromIDList pidl, sTmp
    txtPageTmp.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得ShellNew目录*********************************
    SHGetSpecialFolderLocation 0, SHELLNEW, pidl
    SHGetPathFromIDList pidl, sTmp
    txtShellNew.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '***********************获得Application Data目录*****************************
    SHGetSpecialFolderLocation 0, APPDATA, pidl
    SHGetPathFromIDList pidl, sTmp
    txtAppData.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
    '*************************获得PrintHood目录*********************************
    SHGetSpecialFolderLocation 0, PRINTHOOD, pidl
    SHGetPathFromIDList pidl, sTmp
    txtPrintHood.Text = Left(sTmp, InStr(sTmp, Chr(0)) - 1)
End Sub