获取“我的文档”路径

发布时间:2025-12-09 19:09:15 浏览次数:4

获取“我的文档”路径

很多时候“我的文档”位置经常被人移到D盘,如下是获取“我的文档”路径:

#include  " stdafx.h "
#include  < windows.h >
#include  < shlobj.h >
#pragma comment( lib,  " shell32.lib " )
#include  < iostream >

int  main( int  argc,  char *  argv[])
{
    char m_lpszDefaultDir[MAX_PATH];
    char   szDocument[MAX_PATH]={0};   
    memset(m_lpszDefaultDir,0,_MAX_PATH);   
    
    LPITEMIDLIST pidl=NULL;   
    SHGetSpecialFolderLocation(NULL,   CSIDL_PERSONAL,   &pidl);   
    if   (pidl   &&   SHGetPathFromIDList(pidl,   szDocument))   
    {   
        GetShortPathName(szDocument,m_lpszDefaultDir,_MAX_PATH);   
  }

    std::cout<<m_lpszDefaultDir<<std::endl;
    printf("Hello World!/n");
    return 0;
}

可以使用SHGetSpecialFolderLocation函数获得“我的电脑”所对应的虚拟文件夹的id。然后使用ShellExecuteEx打开这个虚拟文件夹。
    使用API函数SHGetSpecialFolderLocation。shlobj.h里有SHGetSpecialFolderLocation的原型声明。这个函数可以帮我们找到Windows的桌面目录、启动目录、我的文档目录等。
    SHGetSpecialFolder需要三个参数。 第一个参数是HWND,它指定了"所有者窗口":在调用这个函数时可能出现的对话框或消息框。第二个参数是一个整数id,决定哪个目录是待查找目录,它的取值可能是:
    

CSIDL_BITBUCKET回收站
CSIDL_CONTROLS控制面板
CSIDL_DESKTOPWindows 桌面Desktop
CSIDL_DESKTOPDIRECTORYDesktop的目录
CSIDL_DRIVES我的电脑
CSIDL_FONTS字体目录
CSIDL_NETHOOD网上邻居
CSIDL_NETWORK网上邻居虚拟目录
CSIDL_PERSONAL我的文档
CSIDL_PRINTERS打印机
CSIDL_PROGRAMS程序组
CSIDL_RECENT最近打开的文档
CSIDL_SENDTO“发送到”菜单项
CSIDL_STARTMENU任务条启动菜单项
CSIDL_STARTUP启动目录
CSIDL_TEMPLATES文档模板


    这里只是最常用的部分。完整的请参考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp。
    最后一个参数是pidl地址。SHGetSpecialFolderLocation把地址写到pidl。
    下面是一个例子:
    LPITEMIDLIST pidl;
    TCHAR szPath [MAX_PATH];
    LPMALLOC pMalloc;
    
    if ( SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_DRIVES, &pidl )))
    {
     SHELLEXECUTEINFO sei;
     ZeroMemory(&sei, sizeof(sei));
     sei.cbSize = sizeof(sei);
     sei.fMask = SEE_MASK_IDLIST;
     sei.lpIDList = pidl;
     sei.lpVerb = "open";
     sei.hwnd = AfxGetMainWnd()->GetSafeHwnd();
     sei.nShow = SW_SHOWNORMAL;
     ShellExecuteEx(&sei);
     if ( SUCCEEDED( SHGetMalloc ( &pMalloc )))
     {
     pMalloc->Free ( pidl );
     pMalloc->Release();
     }
    }
    
    由于“我的电脑”是虚拟文件夹,所以必须使用ShellExecuteEx函数,如果是普通文件夹,则可以使用SHGetPathFromIDList获得文件名,然后利用ShellExecute函数打开。例如要打开“发送到”文件夹,可以这样:
    if ( SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_SENDTO, &pidl )))
    {
     if ( SHGetPathFromIDList ( pidl, szPath ))
     {
     ShellExecute(AfxGetMainWnd()->GetSafeHwnd(),
     "open", szPath, NULL, NULL,
     SW_SHOWNORMAL);
     }
    
     if ( SUCCEEDED( SHGetMalloc ( &pMalloc )))
     {
     pMalloc->Free ( pidl );
     pMalloc->Release();
     }
    }
    
    
    如果是虚拟文件夹,SHGetPathFromIDList函数会失败。
    对于普通文件夹也可以使用SHGetSpecialFolderPath函数,而不使用SHGetSpecialFolderLocation函数,这样更简单些,但运行环境必须是Windows 2000以后的操作系统或安装了IE 4.0以上版本。

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477