在VB里怎样得到我的文档路径(目录)

解决方案 »

  1.   

    什么意思阿。
    app.path是不是你想说的?
      

  2.   

    获得“桌面”文件夹需要读系统注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders的Desktop值。 
        在这个键下还可以找到“启动”、“我的文档”等目录。 
      

  3.   

    用API可以这样:
      现在有很多关于如何用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各种目录路径的例子,供大家参考。如果您有什么问题或建议,欢迎给我来信([email protected])。
    程序界面如下:程序代码如下:
    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
      

  4.   

    '程序有点长.所有的定义全在 模块中..
    '如果要显示 我的文档的路径只要这么使用
    'me.caption= GetSysDirPath(CSIDL_PERSONAL) Option Explicit
    'SHGetSpecialFolderLocation获得某一个特殊的目录的位置,如果函数调用成功返回NOERROR
    '或者一个OLE错误
    Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" _
    (ByVal hwndOwner As Long, _
    ByVal nFolder As SHSpecialFolderIDs, _
    pidl As Long) As Long
    'SHGetPathFromIDList函数将一个Item转换为文件路径
    Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
    (ByVal pidl As Long, _
    ByVal pszPath As String) As Long'SHGetFileInfoPidl函数获得某个文件对象的信息。
    Declare Function SHGetFileInfoPidl Lib "shell32" Alias "SHGetFileInfoA" _
    (ByVal pidl As Long, _
    ByVal dwFileAttributes As Long, _
    psfib As SHFILEINFOBYTE, _
    ByVal cbFileInfo As Long, _
    ByVal uFlags As SHGFI_flags) As Long
    Public Const MAX_PATH = 260
    Public Const NOERROR = 0
    Public Enum SHSpecialFolderIDs '列出所有Windows下特殊文件夹的ID
    CSIDL_DESKTOP = &H0         '桌面
    CSIDL_INTERNET = &H1
    CSIDL_PROGRAMS = &H2        '程序
    CSIDL_CONTROLS = &H3
    CSIDL_PRINTERS = &H4
    CSIDL_PERSONAL = &H5        '我的文档
    CSIDL_FAVORITES = &H6
    CSIDL_STARTUP = &H7         '开始
    CSIDL_RECENT = &H8
    CSIDL_SENDTO = &H9
    CSIDL_BITBUCKET = &HA
    CSIDL_STARTMENU = &HB
    CSIDL_DESKTOPDIRECTORY = &H10
    CSIDL_DRIVES = &H11
    CSIDL_NETWORK = &H12
    CSIDL_NETHOOD = &H13        '网上邻居
    CSIDL_FONTS = &H14
    CSIDL_TEMPLATES = &H15
    CSIDL_COMMON_STARTMENU = &H16
    CSIDL_COMMON_PROGRAMS = &H17
    CSIDL_COMMON_STARTUP = &H18
    CSIDL_COMMON_DESKTOPDIRECTORY = &H19
    CSIDL_APPDATA = &H1A
    CSIDL_PRINTHOOD = &H1B
    CSIDL_ALTSTARTUP = &H1D
    CSIDL_COMMON_ALTSTARTUP = &H1E
    CSIDL_COMMON_FAVORITES = &H1F
    CSIDL_INTERNET_CACHE = &H20
    CSIDL_COOKIES = &H21
    CSIDL_HISTORY = &H22            '历史文件夹
    End EnumEnum SHGFI_flags
    SHGFI_LARGEICON = &H0
    SHGFI_SMALLICON = &H1
    SHGFI_OPENICON = &H2
    SHGFI_SHELLICONSIZE = &H4
    SHGFI_PIDL = &H8
    SHGFI_USEFILEATTRIBUTES = &H10
    SHGFI_ICON = &H100
    SHGFI_DISPLAYNAME = &H200
    SHGFI_TYPENAME = &H400
    SHGFI_ATTRIBUTES = &H800
    SHGFI_ICONLOCATION = &H1000
    SHGFI_EXETYPE = &H2000
    SHGFI_SYSICONINDEX = &H4000
    SHGFI_LINKOVERLAY = &H8000
    SHGFI_SELECTED = &H10000
    End EnumPublic Type SHFILEINFOBYTE
    hIcon As Long
    iIcon As Long
    dwAttributes As Long
    szDisplayName(1 To MAX_PATH) As Byte
    szTypeName(1 To 80) As Byte
    End TypeDeclare Function SHGetFileInfo Lib "shell32" Alias "SHGetFileInfoA" _
    (ByVal pszPath As String, _
    ByVal dwFileAttributes As Long, _
    psfi As SHFILEINFO, _
    ByVal cbFileInfo As Long, _
    ByVal uFlags As SHGFI_flags) As LongPublic Type SHFILEINFO
    hIcon As Long
    iIcon As Long
    dwAttributes As Long
    szDisplayName As String * MAX_PATH
    szTypeName As String * 80
    End Type'根据一个特定文件夹对象的ID获得它的目录pidl
    Public Function GetPIDLFromFolderID(hOwner As Long, nFolder As SHSpecialFolderIDs) As Long
    Dim pidl As Long
    If SHGetSpecialFolderLocation(hOwner, nFolder, pidl) = NOERROR Then
    GetPIDLFromFolderID = pidl
    End If
    End Function'获取文件夹名称
    Public Function GetDisplayNameFromPIDL(pidl As Long) As String
    Dim sfib As SHFILEINFOBYTE
    If SHGetFileInfoPidl(pidl, 0, sfib, Len(sfib), SHGFI_PIDL Or SHGFI_DISPLAYNAME) Then
    GetDisplayNameFromPIDL = GetStrFromBufferA(StrConv(sfib.szDisplayName, vbUnicode))
    End If
    End Function'获取路径
    Public Function GetPathFromPIDL(pidl As Long) As String
    Dim sPath As String * MAX_PATH
    If SHGetPathFromIDList(pidl, sPath) Then
    GetPathFromPIDL = GetStrFromBufferA(sPath)
    End If
    End Function'获取字符串
    Public Function GetStrFromBufferA(sz As String) As String
    If InStr(sz, vbNullChar) Then
    GetStrFromBufferA = Left$(sz, InStr(sz, vbNullChar) - 1)
    Else
    GetStrFromBufferA = sz
    End If
    End Function'整合以上函数,得到全路径
    Public Function GetSysDirPath(DirType As SHSpecialFolderIDs) As String
    Dim pid As Long
    Dim name As String
    pid = GetPIDLFromFolderID(0, CSIDL_PERSONAL)
    name = GetPathFromPIDL(pid)
    GetSysDirPath = name & GetDisplayNameFromPIDL(pid)
    End Function