トップへ(mam-mam.net/)

特殊フォルダのパスを取得する

検索:

「特殊フォルダのパスを取得する」

特殊フォルダのパスを取得するにはどうしたらいいでしょうか。
また、WindowsXPとWindows7ではどのように違うのでしょうか。

回答

SHGetSpecialFolderPathを使えば取得できます。

function SHGetSpecialFolderPath(
    whndOwner:HWND;  lpszPath:PWideChar;
    nFolder:integer; fCreate:LongBool
):LongBool;

戻り値:成功したらTRUE、失敗でFALSE
whndOwner:オーナーのウィンドウハンドル
lpszPath:取得するパスが入る変数
fCreate:TRUEだとフォルダが存在しない場合に作成
nFolder:取得したい特殊フォルダのCSIDLで始まる以下のいずれかの値

 CSIDL_DESKTOP
  XPの場合 C:\Documents and Settings\<User Name>\デスクトップ
  7の場合  C:\Users\<User Name>\Desktop
 CSIDL_FAVORITES
  XPの場合 C:\Documents and Settings\<User Name>\Favorites
  7の場合  C:\Users\<User Name>\Favorites
 CSIDL_FONTS
  XPの場合 C:\WINDOWS\Fonts
  7の場合  C:\Windows\Fonts
 CSIDL_PERSONAL
  XPの場合 C:\Documents and Settings\<User Name>\My Documents
  7の場合  C:\Users\<User Name>\Documents
 CSIDL_PROGRAM_FILES
  XPの場合 C:\Program Files
  7の場合  C:\Program Files
 CSIDL_PROGRAMS
  XPの場合 C:\Documents and Settings\<User Name>\スタート メニュー\プログラム
  7の場合  C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
 CSIDL_STARTUP
  XPの場合 C:\Documents and Settings\<User Name>\スタート メニュー\プログラム\スタートアップ
  7の場合  C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
 CSIDL_WINDOWS
  XPの場合 C:\WINDOWS
  7の場合  C:\Windows
 CSIDL_SENDTO
  XPの場合 C:\Documents and Settings\<User Name>\SendTo
  7の場合  C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\SendTo
 CSIDL_APPDATA
  XPの場合 C:\Documents and Settings\<User Name>\Application Data
  7の場合  C:\Users\<User Name>\AppData\Roaming
 CSIDL_TEMPLATES
  XPの場合 C:\Documents and Settings\<User Name>\Templates
  7の場合  C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Templates
 CSIDL_COMMON_STARTMENU
  XPの場合 C:\Documents and Settings\All Users\スタート メニュー
  7の場合  C:\ProgramData\Microsoft\Windows\Start Menu
 CSIDL_COMMON_PROGRAMS
  XPの場合 C:\Documents and Settings\All Users\スタート メニュー\プログラム
  7の場合  C:\ProgramData\Microsoft\Windows\Start Menu\Programs
 CSIDL_COMMON_STARTUP
  XPの場合 C:\Documents and Settings\All Users\スタート メニュー\プログラム\スタートアップ
  7の場合  C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
 CSIDL_COMMON_DESKTOPDIRECTORY
  XPの場合 C:\Documents and Settings\All Users\デスクトップ
  7の場合  C:\Users\Public\Desktop
 CSIDL_COMMON_APPDATA
  XPの場合 C:\Documents and Settings\All Users\Application Data
  7の場合  C:\ProgramData
 CSIDL_COMMON_DOCUMENTS
  XPの場合 C:\Documents and Settings\All Users\Documents
  7の場合  C:\Users\Public\Documents
 CSIDL_COMMON_PICTURES
  XPの場合 C:\Documents and Settings\All Users\Documents\My Pictures
  7の場合  C:\Users\Public\Pictures
 CSIDL_COMMON_FAVORITES
  XPの場合 C:\Documents and Settings\All Users\Favorites
  7の場合  C:\Users\<User Name>\Favorites
 CSIDL_COMMON_ADMINTOOLS
  XPの場合 C:\Documents and Settings\All Users\スタート メニュー\プログラム\管理ツール
  7の場合  C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools
 CSIDL_ADMINTOOLS
  XPの場合 C:\Documents and Settings\<user name>\スタート メニュー\プログラム\管理ツール
  7の場合  C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
 CSIDL_LOCAL_APPDATA
  XPの場合 C:\Documents and Settings\<User Name>\Local Settings\Application Data
  7の場合  C:\Users\<User Name>\AppData\Local
 CSIDL_SYSTEM
  XPの場合 C:\WINDOWS\system32
  7の場合  C:\Windows\system32
 CSIDL_PROGRAM_FILES_COMMON
  XPの場合 C:\Program Files\Common Files
  7の場合  C:\Program Files\Common Files
 CSIDL_PROFILE
  XPの場合 C:\Documents and Settings\<User Name>
  7の場合  C:\Users\<User Name>

ソース



(例)Delphi2009以降でデスクトップフォルダのパスを取得
Uses句にWinapi.ShlObjを追加します。

var pw:PWideChar;
    st:string;
begin
  getmem(pw,2048);
  try
    ZeroMemory(pw,2048);
    SHGetSpecialFolderPath(handle,pw,CSIDL_DESKTOP,false);
    st:=pw;
  finally
    freemem(pw);
  end;
  showmessage(st);
end;