선언:
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 |