カテゴリー
C++

Windowsの特別なフォルダ(SHFolders)の列挙

Windows XP, Windows Vista, Windows 7 で動作するアプリを作成する上で、アプリ用のデータを保存するフォルダーとか、個人用のデータを保存するフォルダーなどを Windows 既定の場所を使用したいと思い、そのフォルダーの取得方法を調べました。

MSDNによると、CSIDL を使用する方法はWindows Vista 以降は、互換性のために残されていて、今後は、KNOWNFOLDERID を使用するようにとのことです。

CSIDL:https://msdn.microsoft.com/en-us/library/bb762494%28v=vs.85%29.aspx
KNOWNFOLDERID: https://msdn.microsoft.com/en-us/library/dd378457%28v=vs.85%29.aspx

CSIDL の取得

CSIDL の値をすべて配列にいれておいて、ループで実際のフォルダー名を列挙してます。

// SHFolders.cpp : Known Folders の列挙 
//

#include "stdafx.h"
#include <shlobj.h>


int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR szPath[MAX_PATH];
    typedef struct {
        int csidl;
        TCHAR szId[50];
    } SHFOLDER;

    // CSIDL https://msdn.microsoft.com/en-us/library/bb762494%28v=vs.85%29.aspx

    SHFOLDER folders[] = {
        { CSIDL_ADMINTOOLS, _T("CSIDL_ADMINTOOLS") },
        { CSIDL_ALTSTARTUP, _T("CSIDL_ALTSTARTUP") },
        { CSIDL_APPDATA, _T("CSIDL_APPDATA") },
        { CSIDL_BITBUCKET, _T("CSIDL_BITBUCKET") },
        { CSIDL_CDBURN_AREA, _T("CSIDL_CDBURN_AREA") },
        { CSIDL_COMMON_ADMINTOOLS, _T("CSIDL_COMMON_ADMINTOOLS") },
        { CSIDL_COMMON_ALTSTARTUP, _T("CSIDL_COMMON_ALTSTARTUP") },
        { CSIDL_COMMON_APPDATA, _T("CSIDL_COMMON_APPDATA") },
        { CSIDL_COMMON_DESKTOPDIRECTORY, _T("CSIDL_COMMON_DESKTOPDIRECTORY") },
        { CSIDL_COMMON_DOCUMENTS, _T("CSIDL_COMMON_DOCUMENTS") },
        { CSIDL_COMMON_FAVORITES, _T("CSIDL_COMMON_FAVORITES") },
        { CSIDL_COMMON_MUSIC, _T("CSIDL_COMMON_MUSIC") },
        { CSIDL_COMMON_OEM_LINKS, _T("CSIDL_COMMON_OEM_LINKS") },
        { CSIDL_COMMON_PICTURES, _T("CSIDL_COMMON_PICTURES") },
        { CSIDL_COMMON_PROGRAMS, _T("CSIDL_COMMON_PROGRAMS") },
        { CSIDL_COMMON_STARTMENU, _T("CSIDL_COMMON_STARTMENU") },
        { CSIDL_COMMON_STARTUP, _T("CSIDL_COMMON_STARTUP") },
        { CSIDL_COMMON_TEMPLATES, _T("CSIDL_COMMON_TEMPLATES") },
        { CSIDL_COMMON_VIDEO, _T("CSIDL_COMMON_VIDEO") },
        { CSIDL_COMPUTERSNEARME, _T("CSIDL_COMPUTERSNEARME") },
        { CSIDL_CONNECTIONS, _T("CSIDL_CONNECTIONS") },
        { CSIDL_CONTROLS, _T("CSIDL_CONTROLS") },
        { CSIDL_COOKIES, _T("CSIDL_COOKIES") },
        { CSIDL_DESKTOP, _T("CSIDL_DESKTOP") },
        { CSIDL_DESKTOPDIRECTORY, _T("CSIDL_DESKTOPDIRECTORY") },
        { CSIDL_DRIVES, _T("CSIDL_DRIVES") },
        { CSIDL_FAVORITES, _T("CSIDL_FAVORITES") },
        { CSIDL_FONTS, _T("CSIDL_FONTS") },
        { CSIDL_HISTORY, _T("CSIDL_HISTORY") },
        { CSIDL_INTERNET, _T("CSIDL_INTERNET") },
        { CSIDL_INTERNET_CACHE, _T("CSIDL_INTERNET_CACHE") },
        { CSIDL_LOCAL_APPDATA, _T("CSIDL_LOCAL_APPDATA") },
        { CSIDL_MYDOCUMENTS, _T("CSIDL_MYDOCUMENTS") },
        { CSIDL_MYMUSIC, _T("CSIDL_MYMUSIC") },
        { CSIDL_MYPICTURES, _T("CSIDL_MYPICTURES") },
        { CSIDL_MYVIDEO, _T("CSIDL_MYVIDEO") },
        { CSIDL_NETHOOD, _T("CSIDL_NETHOOD") },
        { CSIDL_NETWORK, _T("CSIDL_NETWORK") },
        { CSIDL_PERSONAL, _T("CSIDL_PERSONAL") },
        { CSIDL_PRINTERS, _T("CSIDL_PRINTERS") },
        { CSIDL_PRINTHOOD, _T("CSIDL_PRINTHOOD") },
        { CSIDL_PROFILE, _T("CSIDL_PROFILE") },
        { CSIDL_PROGRAM_FILES, _T("CSIDL_PROGRAM_FILES") },
        { CSIDL_PROGRAM_FILESX86, _T("CSIDL_PROGRAM_FILESX86") },
        { CSIDL_PROGRAM_FILES_COMMON, _T("CSIDL_PROGRAM_FILES_COMMON") },
        { CSIDL_PROGRAM_FILES_COMMONX86, _T("CSIDL_PROGRAM_FILES_COMMONX86") },
        { CSIDL_PROGRAMS, _T("CSIDL_PROGRAMS") },
        { CSIDL_RECENT, _T("CSIDL_RECENT") },
        { CSIDL_RESOURCES, _T("CSIDL_RESOURCES") },
        { CSIDL_RESOURCES_LOCALIZED, _T("CSIDL_RESOURCES_LOCALIZED") },
        { CSIDL_SENDTO, _T("CSIDL_SENDTO") },
        { CSIDL_STARTMENU, _T("CSIDL_STARTMENU") },
        { CSIDL_STARTUP, _T("CSIDL_STARTUP") },
        { CSIDL_SYSTEM, _T("CSIDL_SYSTEM") },
        { CSIDL_SYSTEMX86, _T("CSIDL_SYSTEMX86") },
        { CSIDL_TEMPLATES, _T("CSIDL_TEMPLATES") },
        { CSIDL_WINDOWS, _T("CSIDL_WINDOWS") }
    };

    // フォルダーの列挙
    for (int i = 0; i < _countof(folders); i++)
    {
        if (SUCCEEDED(SHGetFolderPath(NULL, 
                                       folders[i].csidl | CSIDL_FLAG_DONT_VERIFY, 
                                       NULL, 
                                      0, 
                                      szPath))) 
        {
            _tprintf(_T("%s:%sn"), folders[i].szId, szPath);
        }
    }

    return 0;
}

特別なフォルダの列挙

上記プログラムの実行結果は以下のとおりです。(フォルダ名の一部に個人名が使用されているところは編集しました。)

CSIDL_ADMINTOOLS:C:Documents and Settingsスタート メニュープログラム管理ツール
CSIDL_ALTSTARTUP:
CSIDL_APPDATA:C:Documents and SettingsApplication Data
CSIDL_CDBURN_AREA:C:Documents and SettingsLocal SettingsApplication DataMicrosoftCD Burning
CSIDL_COMMON_ADMINTOOLS:C:Documents and SettingsAll Usersスタート メニュープログラム管理ツール
CSIDL_COMMON_ALTSTARTUP:
CSIDL_COMMON_APPDATA:C:Documents and SettingsAll UsersApplication Data
CSIDL_COMMON_DESKTOPDIRECTORY:C:Documents and SettingsAll Usersデスクトップ
CSIDL_COMMON_DOCUMENTS:C:Documents and SettingsAll UsersDocuments
CSIDL_COMMON_FAVORITES:C:Documents and SettingsAll UsersFavorites
CSIDL_COMMON_MUSIC:C:Documents and SettingsAll UsersDocumentsMy Music
CSIDL_COMMON_OEM_LINKS:
CSIDL_COMMON_PICTURES:C:Documents and SettingsAll UsersDocumentsMy Pictures
CSIDL_COMMON_PROGRAMS:C:Documents and SettingsAll Usersスタート メニュープログラム
CSIDL_COMMON_STARTMENU:C:Documents and SettingsAll Usersスタート メニュー
CSIDL_COMMON_STARTUP:C:Documents and SettingsAll Usersスタート メニュープログラムスタートアップ
CSIDL_COMMON_TEMPLATES:C:Documents and SettingsAll UsersTemplates
CSIDL_COMMON_VIDEO:C:Documents and SettingsAll UsersDocumentsMy Videos
CSIDL_COOKIES:C:Documents and SettingsCookies
CSIDL_DESKTOP:C:Documents and Settingsデスクトップ
CSIDL_DESKTOPDIRECTORY:C:Documents and Settingsデスクトップ
CSIDL_FAVORITES:C:Documents and SettingsFavorites
CSIDL_FONTS:C:WINDOWSFonts
CSIDL_HISTORY:C:Documents and SettingsLocal SettingsHistory
CSIDL_INTERNET_CACHE:C:Documents and SettingsLocal SettingsTemporary Internet Files
CSIDL_LOCAL_APPDATA:C:Documents and SettingsLocal SettingsApplication Data
CSIDL_MYMUSIC:C:Documents and SettingsMy DocumentsMy Music
CSIDL_MYPICTURES:C:Documents and SettingsMy DocumentsMy Pictures
CSIDL_MYVIDEO:C:Documents and SettingsMy DocumentsMy Videos
CSIDL_NETHOOD:C:Documents and SettingsNetHood
CSIDL_PERSONAL:C:Documents and SettingsMy Documents
CSIDL_PRINTHOOD:C:Documents and SettingsPrintHood
CSIDL_PROFILE:C:Documents and Settings
CSIDL_PROGRAM_FILES:C:Program Files
CSIDL_PROGRAM_FILES_COMMON:C:Program FilesCommon Files
CSIDL_PROGRAMS:C:Documents and Settingsスタート メニュープログラム
CSIDL_RECENT:C:Documents and SettingsRecent
CSIDL_RESOURCES:C:WINDOWSresources
CSIDL_RESOURCES_LOCALIZED:C:WINDOWSresources411
CSIDL_SENDTO:C:Documents and SettingsSendTo
CSIDL_STARTMENU:C:Documents and Settingsスタート メニュー
CSIDL_STARTUP:C:Documents and Settingsスタート メニュープログラムスタートアップ
CSIDL_SYSTEM:C:WINDOWSsystem32
CSIDL_SYSTEMX86:C:WINDOWSsystem32
CSIDL_TEMPLATES:C:Documents and SettingsTemplates
CSIDL_WINDOWS:C:WINDOWS

以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください