2013-07-24 2 views
0

Мне нужно открыть окно проводника, показывающее конкретную папку, скажем "C:\\Windows" Какую функцию я должен использовать для достижения своей цели? Я использую Windows, поэтому могу использовать API, также могу использовать boost, но я не могу использовать C++ 11.Как открыть папку с C++

+0

Что именно вы имеете в виду «открыть папку» ? Вы пытаетесь перечислить файлы в папке? –

+0

Я хочу что-то вроде 'system (" explorer.exe ")' –

+0

О, так что используйте опцию '/ e,': 'explorer.exe/e, ' и используйте' system' –

ответ

3

Вы можете использовать функцию SHOpenFolderAndSelectItems, чтобы сделать это, а не принудительно работает Проводник самостоятельно (что, если Например, пользователь заменил Explorer как своего файлового менеджера по умолчанию?).

LPCWSTR pszPathToOpen = L"C:\\Windows"; 
PIDLIST_ABSOLUTE pidl; 
if (SUCCEEDED(SHParseDisplayName(pszPathToOpen, 0, &pidl, 0, 0))) 
{ 
    // we don't want to actually select anything in the folder, so we pass an empty 
    // PIDL in the array. if you want to select one or more items in the opened 
    // folder you'd need to build the PIDL array appropriately 
    ITEMIDLIST idNull = { 0 }; 
    LPCITEMIDLIST pidlNull[1] = { &idNull }; 
    SHOpenFolderAndSelectItems(pidl, 1, pidlNull, 0); 
    ILFree(pidl); 
} 

В качестве альтернативы, вы можете вызвать ShellExecute папку непосредственно запускать его действие по умолчанию (которое обычно откроется в окне браузера):

ShellExecute(NULL, NULL, L"C:\\Windows", NULL, NULL, SW_SHOWNORMAL); 
+0

При использовании 'ShellExecute()' вы можете (и должны) установить глагол '' expl "" вместо полагаясь на действие по умолчанию: «* Обычно используются следующие глаголы: ... ** explum ** Исследует папку, указанную lpFile. *« –

+0

@RemyLebeau Citation for «should»? –

0

Час назад я только что написал аналогичную функцию.

Эта функция не делает 100%, как вы хотите, но вы можете использовать ее, чтобы получить то, что хотите. Он открывает окно проводника и файл меток, на которые вы указываете. Допустим, вы указали "C:\Windows\System32", в этом случае у вас будет "C:\Windows" и System32. Если вы хотите зайти внутрь, вам нужно использовать что-то вроде FindFirstFile. Если папка пуста, мое Предлагаемое решение не будет работать ...

bool ExplorerGoTo (const String &Path) 
{ 
    TCHAR tcBuff[8] = {0}; 
    lstrcpyn(tcBuff, Path.c_str(), 5); 

    String stParams = _T("/n, /select, "); 

    if(lstrcmpi(_T("\\??\\"), tcBuff) == 0) 
    { 
     stParams += (Path[4]); 
    } 
    else 
    { 
     stParams += Path; 
    } 

    String stExplorer = _T("C:\\Windows\\explorer.exe"); 

    //ExpandPath(stExplorer); 
    if (stExplorer.empty()) stExplorer = _T("explorer.exe"); 

    SHELLEXECUTEINFO shi = { 0 }; 

    shi.cbSize   = sizeof (SHELLEXECUTEINFO); 
    shi.lpVerb   = _T("open"); 
    shi.lpFile   = stExplorer.c_str(); 
    shi.lpParameters = stParams.c_str(); 
    shi.nShow   = SW_SHOW; 

    bool bRes = ShellExecuteEx(&shi); 

    if(bRes == FALSE && GetLastError() != 0) 
    { 
     Sleep(200); 
     return ShellExecuteEx(&shi); 
    } 
    return bRes; 
} 

И никогда не использовать system()