시스템 프로그래밍을 하다보면 .. 윈도에서 흔히 쓰는 경로들 ..
바탕화면, 다운로드, 폰트 같은 경로들을 얻어 써야 하는 경우가 있습니다.
이중 바탕화면이나 다운로드 같은 경로는.. 보통은 특정 룰을 가지고 생성되지만
사용자가 경로를 변경해서 쓸수도 있지요 ..
레지스트리를 직접 읽어서 처리하는 방법도 있지만 32비트 64비트 분리해서 처리하고 이래저래 복잡할 수 있습니다.
MS에서는 이러한 경로들을 얻을수 있도록
SHGetKnownFolderPath
라는 함수를 제공합니다.
이 함수를 통해 얻을 수 있는 경로는 ..

KNOWNFOLDERID (Knownfolders.h) – Win32 apps
The KNOWNFOLDERID constants represent GUIDs that identify standard folders registered with the system as Known Folders.
이 링크를 참고하시면 되겠구요 ..

이런식으로 주욱 리스트가 표시됩니다. 위 경우는 데스크탑 경로를 얻을때 사용하면 되겠구요 ..
중요한건 .. 제가 지금 .. 안내하는건 Go언어에서 이짓을 어케하느냐?
Go
package main
import (
"syscall"
)
func main() {
// HRESULT SHGetKnownFolderPath(
// _In_ REFKNOWNFOLDERID rfid,
// _In_ DWORD dwFlags,
// _In_opt_ HANDLE hToken,
// _Out_ PWSTR *ppszPath
// );
var (
shell32 = syscall.NewLazyDLL("Shell32.dll")
shGetKnowFolderPath = shell32.NewProc("SHGetKnownFolderPath")
// Doesn't work, of course:
folderId int
flags int
handle int
retval int
)
shGetKnowFolderPath.Call(uintptr(folderId), uintptr(flags), uintptr(handle), uintptr(retval))
}
이런식으로 .. 직접 shell32.dll 에서 해당 함수를 동적으로 로드해서 사용하실 수도 있겠지만 ..
Go
package main
import (
"fmt"
"golang.org/x/sys/windows"
)
func main() {
path, err := windows.KnownFolderPath(windows.FOLDERID_Fonts, 0)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(path)
}
x/sys/windows 패키지에 이미 해당 함수를 export 시켜두고 폴더ID관련된 파라메터도 다 정리를 해 두었습니다. 이런식으로 윈도 시스템 경로들을 얻어 사용하시면 되겠습니다.