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

Windowsの特殊フォルダのフルパスを取得 ~Delphiソースコード集

検索:

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.