Windowsの特殊フォルダのフルパスを取得 ~Delphiソースコード集
Windowsの特殊フォルダ(デスクトップやMyDocument等)のフルパスを取得する方法
SHGetSpecialFolderPath関数
WindowsのAPI関数SHGetSpecialFolderPathを使用します。
function SHGetSpecialFolderPath(hwndOwner:HWND; lpszPath:PWideChar; nFolder:integer; fCreate:LongBool):LongBool;
- 戻り値
- 成功したらTRUE、失敗でFALSE
- whndOwner
- オーナーのウィンドウハンドル
- lpszPath
- 取得するパスが入る変数
- nFolder
- 取得したい特殊フォルダのCSIDLで始まる値
- fCreate
- TRUEだとフォルダが存在しない場合に作成
nFolderに設定できる特殊フォルダのCSIDLで始まる値
- CSIDL_DESKTOP
-
ユーザーのデスクトップ
(例)C:\Users\<User Name>\Desktop - CSIDL_FAVORITES
-
ユーザーのお気に入りの項目の共通リポジトリとして機能するファイル システム ディレクトリ
(例)C:\Users\<User Name>\Favorites - CSIDL_FONTS
-
フォントが含まれる仮想フォルダ
(例)C:\Windows\Fonts - CSIDL_PERSONAL
-
マイ ドキュメント デスクトップ項目を表す仮想フォルダでCSIDL_MYDOCUMENTSと同じ
(例)C:\Users\<User Name>\Documents - CSIDL_PROGRAM_FILES
-
Program Files フォルダ
(例)C:\Program Files - CSIDL_PROGRAMS
-
ユーザーの [スタート ] メニューに表示されるプログラム グループのディレクトリ
(例)C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs - CSIDL_STARTUP
-
ユーザーのスタートアップ プログラム グループのディレクトリ
このディレクトリ内にショートカットを作成すると、ユーザーログイン時に実行される
(例)C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup - CSIDL_WINDOWS
-
Windows ディレクトリで、%windir% 環境変数または %SYSTEMROOT% 環境変数に対応します
(例)C:\Windows - CSIDL_SENDTO
-
メニュー項目を含むディレクトリ
このディレクトリにショートカットを入れると、右クリック時のメニューの「送る(N)」に表示される
(例)C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\SendTo - CSIDL_APPDATA
-
プリケーション固有のデータの共通リポジトリとして機能するディレクトリ
(例)C:\Users\<User Name>\AppData\Roaming - CSIDL_TEMPLATES
-
テンプレートの共通リポジトリとして機能するディレクトリ
(例)C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Templates - CSIDL_COMMON_STARTMENU
-
すべてのユーザーの [スタート] メニューに表示されるプログラムやフォルダーを格納するディレクトリ
(例)C:\ProgramData\Microsoft\Windows\Start Menu - CSIDL_COMMON_PROGRAMS
-
すべてのユーザーの [スタート ] メニューに表示される共通プログラム グループのディレクトリ
(例)C:\ProgramData\Microsoft\Windows\Start Menu\Programs - CSIDL_COMMON_STARTUP
-
全てのユーザーのスタートアップ プログラム グループのディレクトリ
このディレクトリ内にショートカットを作成すると、全てのユーザーがログイン時に実行される
(例)C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup - CSIDL_COMMON_DESKTOPDIRECTORY
-
すべてのユーザーのデスクトップに表示されるファイルおよびフォルダーを格納するディレクト
(例)C:\Users\Public\Desktop - CSIDL_COMMON_APPDATA
-
すべてのユーザーのアプリケーション データを含むディレクトリ
(例)C:\ProgramData - CSIDL_COMMON_DOCUMENTS
-
すべてのユーザーに共通のドキュメントを格納するディレクトリ
(例)C:\Users\Public\Documents - CSIDL_COMMON_PICTURES
-
すべてのユーザーに共通のイメージ ファイルを格納するディレクトリ
(例)C:\Users\Public\Pictures - CSIDL_COMMON_FAVORITES
-
すべてのユーザーに共通のお気に入りの項目のディレクトリ
(例)C:\Users\<User Name>\Favorites - CSIDL_COMMON_ADMINTOOLS
-
すべてのユーザーの管理ツールを格納するディレクトリ
(例)C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools - CSIDL_ADMINTOOLS
-
ユーザーの管理ツールを格納するディレクトリ
(例)C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools - CSIDL_LOCAL_APPDATA
-
ローカル (非roaming) アプリケーションのデータ リポジトリとして機能するディレクトリ
(例)C:\Users\<User Name>\AppData\Local - CSIDL_SYSTEM
-
Windows のシステム フォルダ
(例)C:\Windows\system32 - CSIDL_PROGRAM_FILES_COMMON
-
アプリケーション間で共有されるコンポーネントを格納するフォルダ
(例)C:\Program Files\Common Files - CSIDL_PROFILE
-
ユーザーのプロファイル フォルダ
(例)C:\Users\<User Name> - CSIDL_RECENT
-
ユーザーの最近使用したドキュメントへのショートカットを含むディレクトリ
(例)C:\Users\\<User Name>\AppData\Roaming\Microsoft\Windows\Recent - CSIDL_PRINTHOOD
-
[プリンター] 仮想フォルダーに存在できるリンク オブジェクトを格納するディレクトリ
(例)C:\Users\\<User Name>\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
SHGetSpecialFolderPath関数の使用例
uses に「Winapi.ShlObj」を追加する必要があります。
以下ソースコードはデスクトップのフォルダのフルパスを取得します。
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} uses Winapi.ShlObj; procedure TForm1.Button1Click(Sender: TObject); var path:array[0..MAX_PATH-1] of Char; st:String; begin ZeroMemory(@path[0], MAX_PATH*SizeOf(Char)); SHGetSpecialFolderPath(0, path, CSIDL_DESKTOP, False); ShowMessage(path); end; end.