모두의 프린터는 어떠한 경우에도 회원가입, 카드결제를 요구하지 않습니다.

MS윈도 – 알려진 폴더 경로 얻기

시스템 프로그래밍을 하다보면 .. 윈도에서 흔히 쓰는 경로들 ..

바탕화면, 다운로드, 폰트 같은 경로들을 얻어 써야 하는 경우가 있습니다.

이중 바탕화면이나 다운로드 같은 경로는.. 보통은 특정 룰을 가지고 생성되지만 

사용자가 경로를 변경해서 쓸수도 있지요 ..

레지스트리를 직접 읽어서 처리하는 방법도 있지만 32비트 64비트 분리해서 처리하고 이래저래 복잡할 수 있습니다.

MS에서는 이러한 경로들을 얻을수 있도록

SHGetKnownFolderPath

라는 함수를 제공합니다.

이 함수를 통해 얻을 수 있는 경로는 ..

이 링크를 참고하시면 되겠구요 ..

이런식으로 주욱 리스트가 표시됩니다. 위 경우는 데스크탑 경로를 얻을때 사용하면 되겠구요 ..

중요한건 .. 제가 지금 .. 안내하는건 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관련된 파라메터도 다 정리를 해 두었습니다. 이런식으로 윈도 시스템 경로들을 얻어 사용하시면 되겠습니다.

출처

%d