here is the complete example to get directory on Windows, use DFL to compatible between Phobos and Tango, Tango seems lack some functionality on Windows:
import dfl.all;
pragma(lib, "shell32.lib");
pragma(lib, "dfl.lib"); //use dfl to compatible between Phobos and Tango
//from win32.windef
const size_t MAX_PATH = 260;
// from win32.shlobj
extern(Windows) int SHGetSpecialFolderPathA(void*,char*,int, int);
alias SHGetSpecialFolderPathA SHGetSpecialFolderPath;
enum {
CSIDL_DESKTOP = 0,
CSIDL_INTERNET,
CSIDL_PROGRAMS,
CSIDL_CONTROLS,
CSIDL_PRINTERS,
CSIDL_PERSONAL,
CSIDL_FAVORITES,
CSIDL_STARTUP,
CSIDL_RECENT,
CSIDL_SENDTO,
CSIDL_BITBUCKET,
CSIDL_STARTMENU, // = 11
CSIDL_DESKTOPDIRECTORY = 16,
CSIDL_DRIVES,
CSIDL_NETWORK,
CSIDL_NETHOOD,
CSIDL_FONTS,
CSIDL_TEMPLATES,
CSIDL_COMMON_STARTMENU,
CSIDL_COMMON_PROGRAMS,
CSIDL_COMMON_STARTUP,
CSIDL_COMMON_DESKTOPDIRECTORY,
CSIDL_APPDATA,
CSIDL_PRINTHOOD,
CSIDL_LOCAL_APPDATA,
CSIDL_ALTSTARTUP,
CSIDL_COMMON_ALTSTARTUP,
CSIDL_COMMON_FAVORITES,
CSIDL_INTERNET_CACHE,
CSIDL_COOKIES,
CSIDL_HISTORY,
CSIDL_COMMON_APPDATA,
CSIDL_WINDOWS,
CSIDL_SYSTEM,
CSIDL_PROGRAM_FILES,
CSIDL_MYPICTURES,
CSIDL_PROFILE,
CSIDL_SYSTEMX86,
CSIDL_PROGRAM_FILESX86,
CSIDL_PROGRAM_FILES_COMMON,
CSIDL_PROGRAM_FILES_COMMONX86,
CSIDL_COMMON_TEMPLATES,
CSIDL_COMMON_DOCUMENTS,
CSIDL_COMMON_ADMINTOOLS,
CSIDL_ADMINTOOLS,
CSIDL_CONNECTIONS, // =49
CSIDL_COMMON_MUSIC = 53,
CSIDL_COMMON_PICTURES,
CSIDL_COMMON_VIDEO,
CSIDL_RESOURCES,
CSIDL_RESOURCES_LOCALIZED,
CSIDL_COMMON_OEM_LINKS,
CSIDL_CDBURN_AREA, // = 59
CSIDL_COMPUTERSNEARME = 61,
CSIDL_FLAG_DONT_VERIFY = 0x4000,
CSIDL_FLAG_CREATE = 0x8000,
CSIDL_FLAG_MASK = 0xFF00
}
//
char[] getPath(int csidl)
{
char[] result;
char[][int] acsidl;
try
{
version(Unicode)
{
alias wchar mychar; //my char
alias dfl.internal.utf.fromUnicodez fromz;
}
else
{
alias char mychar;
alias dfl.internal.utf.fromAnsiz fromz;
}
mychar[] spath = new mychar[MAX_PATH]; //string of path
if ( !SHGetSpecialFolderPath(null, spath.ptr ,csidl,true) ) return null;
result = fromz(spath.ptr);
}
catch(Exception e)
{
//printf("getPath catch %.*s\n",e.msg);
return null;
}
return result;
}
//
void main()
{
char[] s = getPath(CSIDL_APPDATA);
msgBox(s);
//C:\Documents and Settings\username\Application Data
}