paths_windows.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package xdg
  2. import (
  3. "path/filepath"
  4. "github.com/adrg/xdg/internal/pathutil"
  5. "github.com/adrg/xdg/internal/userdirs"
  6. "golang.org/x/sys/windows"
  7. )
  8. func initDirs(home string) {
  9. kf := initKnownFolders(home)
  10. initBaseDirs(home, kf)
  11. initUserDirs(home, kf)
  12. }
  13. func initBaseDirs(home string, kf *knownFolders) {
  14. // Initialize standard directories.
  15. baseDirs.dataHome = pathutil.EnvPath(envDataHome, kf.localAppData)
  16. baseDirs.data = pathutil.EnvPathList(envDataDirs, kf.roamingAppData, kf.programData)
  17. baseDirs.configHome = pathutil.EnvPath(envConfigHome, kf.localAppData)
  18. baseDirs.config = pathutil.EnvPathList(envConfigDirs, kf.programData, kf.roamingAppData)
  19. baseDirs.stateHome = pathutil.EnvPath(envStateHome, kf.localAppData)
  20. baseDirs.cacheHome = pathutil.EnvPath(envCacheHome, filepath.Join(kf.localAppData, "cache"))
  21. baseDirs.runtime = pathutil.EnvPath(envRuntimeDir, kf.localAppData)
  22. // Initialize non-standard directories.
  23. baseDirs.binHome = pathutil.EnvPath(envBinHome, kf.userProgramFiles)
  24. baseDirs.applications = []string{
  25. kf.programs,
  26. kf.commonPrograms,
  27. kf.programFiles,
  28. kf.programFilesCommon,
  29. kf.userProgramFiles,
  30. kf.userProgramFilesCommon,
  31. }
  32. baseDirs.fonts = []string{
  33. kf.fonts,
  34. filepath.Join(kf.localAppData, "Microsoft", "Windows", "Fonts"),
  35. }
  36. }
  37. func initUserDirs(home string, kf *knownFolders) {
  38. UserDirs.Desktop = pathutil.EnvPath(userdirs.EnvDesktopDir, kf.desktop)
  39. UserDirs.Download = pathutil.EnvPath(userdirs.EnvDownloadDir, kf.downloads)
  40. UserDirs.Documents = pathutil.EnvPath(userdirs.EnvDocumentsDir, kf.documents)
  41. UserDirs.Music = pathutil.EnvPath(userdirs.EnvMusicDir, kf.music)
  42. UserDirs.Pictures = pathutil.EnvPath(userdirs.EnvPicturesDir, kf.pictures)
  43. UserDirs.Videos = pathutil.EnvPath(userdirs.EnvVideosDir, kf.videos)
  44. UserDirs.Templates = pathutil.EnvPath(userdirs.EnvTemplatesDir, kf.templates)
  45. UserDirs.PublicShare = pathutil.EnvPath(userdirs.EnvPublicShareDir, kf.public)
  46. }
  47. type knownFolders struct {
  48. systemDrive string
  49. systemRoot string
  50. programData string
  51. userProfile string
  52. userProfiles string
  53. roamingAppData string
  54. localAppData string
  55. desktop string
  56. downloads string
  57. documents string
  58. music string
  59. pictures string
  60. videos string
  61. templates string
  62. public string
  63. fonts string
  64. programs string
  65. commonPrograms string
  66. programFiles string
  67. programFilesCommon string
  68. userProgramFiles string
  69. userProgramFilesCommon string
  70. }
  71. func initKnownFolders(home string) *knownFolders {
  72. kf := &knownFolders{
  73. userProfile: home,
  74. }
  75. kf.systemDrive = filepath.VolumeName(pathutil.KnownFolder(
  76. windows.FOLDERID_Windows,
  77. []string{"SystemDrive", "SystemRoot", "windir"},
  78. []string{home, `C:`},
  79. )) + string(filepath.Separator)
  80. kf.systemRoot = pathutil.KnownFolder(
  81. windows.FOLDERID_Windows,
  82. []string{"SystemRoot", "windir"},
  83. []string{filepath.Join(kf.systemDrive, "Windows")},
  84. )
  85. kf.programData = pathutil.KnownFolder(
  86. windows.FOLDERID_ProgramData,
  87. []string{"ProgramData", "ALLUSERSPROFILE"},
  88. []string{filepath.Join(kf.systemDrive, "ProgramData")},
  89. )
  90. kf.userProfiles = pathutil.KnownFolder(
  91. windows.FOLDERID_UserProfiles,
  92. nil,
  93. []string{filepath.Join(kf.systemDrive, "Users")},
  94. )
  95. kf.roamingAppData = pathutil.KnownFolder(
  96. windows.FOLDERID_RoamingAppData,
  97. []string{"APPDATA"},
  98. []string{filepath.Join(home, "AppData", "Roaming")},
  99. )
  100. kf.localAppData = pathutil.KnownFolder(
  101. windows.FOLDERID_LocalAppData,
  102. []string{"LOCALAPPDATA"},
  103. []string{filepath.Join(home, "AppData", "Local")},
  104. )
  105. kf.desktop = pathutil.KnownFolder(
  106. windows.FOLDERID_Desktop,
  107. nil,
  108. []string{filepath.Join(home, "Desktop")},
  109. )
  110. kf.downloads = pathutil.KnownFolder(
  111. windows.FOLDERID_Downloads,
  112. nil,
  113. []string{filepath.Join(home, "Downloads")},
  114. )
  115. kf.documents = pathutil.KnownFolder(
  116. windows.FOLDERID_Documents,
  117. nil,
  118. []string{filepath.Join(home, "Documents")},
  119. )
  120. kf.music = pathutil.KnownFolder(
  121. windows.FOLDERID_Music,
  122. nil,
  123. []string{filepath.Join(home, "Music")},
  124. )
  125. kf.pictures = pathutil.KnownFolder(
  126. windows.FOLDERID_Pictures,
  127. nil,
  128. []string{filepath.Join(home, "Pictures")},
  129. )
  130. kf.videos = pathutil.KnownFolder(
  131. windows.FOLDERID_Videos,
  132. nil,
  133. []string{filepath.Join(home, "Videos")},
  134. )
  135. kf.templates = pathutil.KnownFolder(
  136. windows.FOLDERID_Templates,
  137. nil,
  138. []string{filepath.Join(kf.roamingAppData, "Microsoft", "Windows", "Templates")},
  139. )
  140. kf.public = pathutil.KnownFolder(
  141. windows.FOLDERID_Public,
  142. []string{"PUBLIC"},
  143. []string{filepath.Join(kf.userProfiles, "Public")},
  144. )
  145. kf.fonts = pathutil.KnownFolder(
  146. windows.FOLDERID_Fonts,
  147. nil,
  148. []string{filepath.Join(kf.systemRoot, "Fonts")},
  149. )
  150. kf.programs = pathutil.KnownFolder(
  151. windows.FOLDERID_Programs,
  152. nil,
  153. []string{filepath.Join(kf.roamingAppData, "Microsoft", "Windows", "Start Menu", "Programs")},
  154. )
  155. kf.commonPrograms = pathutil.KnownFolder(
  156. windows.FOLDERID_CommonPrograms,
  157. nil,
  158. []string{filepath.Join(kf.programData, "Microsoft", "Windows", "Start Menu", "Programs")},
  159. )
  160. kf.programFiles = pathutil.KnownFolder(
  161. windows.FOLDERID_ProgramFiles,
  162. []string{"ProgramFiles"},
  163. []string{filepath.Join(kf.systemDrive, "Program Files")},
  164. )
  165. kf.programFilesCommon = pathutil.KnownFolder(
  166. windows.FOLDERID_ProgramFilesCommon,
  167. nil,
  168. []string{filepath.Join(kf.programFiles, "Common Files")},
  169. )
  170. kf.userProgramFiles = pathutil.KnownFolder(
  171. windows.FOLDERID_UserProgramFiles,
  172. nil,
  173. []string{
  174. filepath.Join(kf.localAppData, "Programs"),
  175. },
  176. )
  177. kf.userProgramFilesCommon = pathutil.KnownFolder(
  178. windows.FOLDERID_UserProgramFilesCommon,
  179. nil,
  180. []string{
  181. filepath.Join(kf.userProgramFiles, "Common"),
  182. },
  183. )
  184. return kf
  185. }