선언:

C#

[DllImport("shell32", CharSet = CharSet.Auto)]
public static extern Int32 SHGetFolderPath(IntPtr hwndOwner, Int32 nFolder, IntPtr hToken, Int32 dwFlags, out String pszPath);


VB.NET

<DllImport("shell32")> _
Public Shared Function SHGetFolderPath(hwndOwner As IntPtr, nFolder As Int32, hToken As IntPtr, dwFlags As Int32, pszPath As StringBuilder) As Int32
End Function




사용 예제:

C#

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace ApiReference {
    class Program {
        
        [DllImport("shell32")]
        public static extern Int32 SHGetFolderPath(IntPtr hwndOwner, Int32 nFolder, IntPtr hToken, Int32 dwFlags, StringBuilder pszPath);
        public const Int32 CSIDL_DESKTOP = 0x0;
        public const Int32 CSIDL_MYDOCUMENTS = 0x5;
        public const Int32 CSIDL_PROGRAM_FILES = 0x0026;
        public const Int32 CSIDL_PROGRAM_FILES_COMMON = 0x002b;
        public const Int32 CSIDL_PROGRAM_FILES_COMMONX86 = 0x002c;
        public const Int32 CSIDL_PROGRAM_FILESX86 = 0x002a;
        
        public static String GetSpecialFolderPath(Int32 folderType) {
            StringBuilder sbPath = new StringBuilder(260);
            SHGetFolderPath(IntPtr.Zero, folderType, IntPtr.Zero, 0, sbPath);
            return sbPath.ToString();
        }
        public static void Main(string[] args) {
            
            String desktopPath = GetSpecialFolderPath(CSIDL_DESKTOP);
            String myDocumentPath = GetSpecialFolderPath(CSIDL_MYDOCUMENTS);
            String programFilePath = GetSpecialFolderPath(CSIDL_PROGRAM_FILES);
            String programFilePathX86 = GetSpecialFolderPath(CSIDL_PROGRAM_FILESX86);

            Console.Write("바탕 화면 폴더 위치: \n  ");
            if ( String.IsNullOrEmpty(desktopPath) )
                Console.WriteLine("알 수 없음");
            else
                Console.WriteLine(desktopPath);

            Console.Write("내 문서 폴더 위치: \n  ");
            if ( String.IsNullOrEmpty(myDocumentPath) )
                Console.WriteLine("알 수 없음");
            else
                Console.WriteLine(myDocumentPath);

            Console.Write("프로그램 파일 폴더 위치: \n  ");
            if ( String.IsNullOrEmpty(programFilePath) )
                Console.WriteLine("알 수 없음");
            else
                Console.WriteLine(programFilePath);

            Console.Write("프로그램 파일(X86) 폴더 위치: \n  ");
            if ( String.IsNullOrEmpty(programFilePathX86) )
                Console.WriteLine("알 수 없음");
            else
                Console.WriteLine(programFilePathX86);

            
            Console.ReadKey(true);
        }
    }
}


VB.NET

Imports System
Imports System.Runtime.InteropServices
Imports System.Text

Namespace ApiReference
    Class Program

        <DllImport("shell32")> _
        Public Shared Function SHGetFolderPath(hwndOwner As IntPtr, nFolder As Int32, hToken As IntPtr, dwFlags As Int32, pszPath As StringBuilder) As Int32
        End Function
        Public Const CSIDL_DESKTOP As Int32 = &H0
        Public Const CSIDL_MYDOCUMENTS As Int32 = &H5
        Public Const CSIDL_PROGRAM_FILES As Int32 = &H26
        Public Const CSIDL_PROGRAM_FILES_COMMON As Int32 = &H2b
        Public Const CSIDL_PROGRAM_FILES_COMMONX86 As Int32 = &H2c
        Public Const CSIDL_PROGRAM_FILESX86 As Int32 = &H2a

        Public Shared Function GetSpecialFolderPath(folderType As Int32) As [String]
            Dim sbPath As New StringBuilder(260)
            SHGetFolderPath(IntPtr.Zero, folderType, IntPtr.Zero, 0, sbPath)
            Return sbPath.ToString()
        End Function
        Public Shared Sub Main(args As String())

            Dim desktopPath As [String] = GetSpecialFolderPath(CSIDL_DESKTOP)
            Dim myDocumentPath As [String] = GetSpecialFolderPath(CSIDL_MYDOCUMENTS)
            Dim programFilePath As [String] = GetSpecialFolderPath(CSIDL_PROGRAM_FILES)
            Dim programFilePathX86 As [String] = GetSpecialFolderPath(CSIDL_PROGRAM_FILESX86)

            Console.Write("바탕 화면 폴더 위치: " & vbLf & "  ")
            If [String].IsNullOrEmpty(desktopPath) Then
                Console.WriteLine("알 수 없음")
            Else
                Console.WriteLine(desktopPath)
            End If

            Console.Write("내 문서 폴더 위치: " & vbLf & "  ")
            If [String].IsNullOrEmpty(myDocumentPath) Then
                Console.WriteLine("알 수 없음")
            Else
                Console.WriteLine(myDocumentPath)
            End If

            Console.Write("프로그램 파일 폴더 위치: " & vbLf & "  ")
            If [String].IsNullOrEmpty(programFilePath) Then
                Console.WriteLine("알 수 없음")
            Else
                Console.WriteLine(programFilePath)
            End If

            Console.Write("프로그램 파일(X86) 폴더 위치: " & vbLf & "  ")
            If [String].IsNullOrEmpty(programFilePathX86) Then
                Console.WriteLine("알 수 없음")
            Else
                Console.WriteLine(programFilePathX86)
            End If


            Console.ReadKey(True)
        End Sub
    End Class
End Namespace




예제 실행 결과:




매개 변수 설명:

hWndOwner - 예약된 매개 변수입니다. IntPtr.Zero를 사용합니다.

nFolder - 가져올 폴더의 형식을 입력합니다. 자세한 내용은 비고를 참고하시기 바랍니다.

hToken - 권한 토큰(Access Token)을 입력합니다. 보통 IntPtr.Zero를 사용합니다.

dwFlags - 반환될 경로에 대한 옵션을 입력합니다. 보통 0을 사용합니다.

pszPath - 폴더의 경로가 저장될 변수를 입력합니다.




API 설명:

특정 폴더의 경로를 가져옵니다.




참고:

SHGetFolderPath (MSDN)




비고:

가져올 폴더의 형식은 CSIDL 열거형 페이지 (PInvoke.NET)를 참고하시기 바랍니다.

특정 사용자에게만 접근 권한이 있는 폴더의 경우엔 권한 토큰을 해당 사용자에 맞게 설정하시면 됩니다.

nFolder 값에 CSIDL_FLAG_CREATE(0x8000) 를 줄 경우엔 폴더가 없으면 강제로 생성하도록 지정할 수 있습니다.

'API Reference' 카테고리의 다른 글

38. GetSystemTime  (0) 2014.10.30
37. SYSTEMTIME  (0) 2014.10.30
35. GetComputerName  (0) 2014.10.24
34. GetWindowsDirectory  (0) 2014.10.24
33. GetSystemDirectory  (0) 2014.10.23

+ Recent posts