2016-09-16 6 views
11

해당 ID로 디렉토리/폴더의 위치를 ​​가져 오려고합니다.
예를 들어 다운로드 폴더의 ID는 knownfolder:{374DE290-123F-4565-9164-39C4925E467B}입니다. Windows 탐색기의 주소 표시 줄에 입력하면 내 다운로드 폴더로 리디렉션됩니다.C# ID로 알려진 폴더의 위치를 ​​얻습니다

enter image description here

가이 ID와 해당 폴더 here의 목록입니다, 그래서 ID를 하드 코드와 같이 그들을 보이지만, 나는 그것의 유일한 방법하지 않는 한이 작업을 수행 할 수 wouldnt가 있었다.

내가 원하는 것을 제대로 얻을 수있는 또 다른 방법이 있습니까?

답변

14

도난 here에서. 이 또한, 유일한 방법을 보면 그것이 WinAPI를/PInvoke를

public static class KnownFolderFinder 
{ 
    private static readonly Guid CommonDocumentsGuid = new Guid("ED4824AF-DCE4-45A8-81E2-FC7965083634"); 

    [Flags] 
    public enum KnownFolderFlag : uint 
    { 
     None = 0x0, 
     CREATE = 0x8000, 
     DONT_VERFIY = 0x4000, 
     DONT_UNEXPAND= 0x2000, 
     NO_ALIAS = 0x1000, 
     INIT = 0x800, 
     DEFAULT_PATH = 0x400, 
     NOT_PARENT_RELATIVE = 0x200, 
     SIMPLE_IDLIST = 0x100, 
     ALIAS_ONLY = 0x80000000 
    } 

    [DllImport("shell32.dll")] 
    static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath); 

    public static string GetFolderFromKnownFolderGUID(Guid guid) 
    { 
     return pinvokePath(guid, KnownFolderFlag.DEFAULT_PATH); 
    } 

    public static void EnumerateKnownFolders() 
    { 
     KnownFolderFlag[] flags = new KnownFolderFlag[] { 
      KnownFolderFlag.None, 
      KnownFolderFlag.ALIAS_ONLY | KnownFolderFlag.DONT_VERFIY, 
      KnownFolderFlag.DEFAULT_PATH | KnownFolderFlag.NOT_PARENT_RELATIVE, 
     }; 


     foreach (var flag in flags) 
     { 
      Console.WriteLine(string.Format("{0}; P/Invoke==>{1}", flag, pinvokePath(CommonDocumentsGuid, flag))); 
     } 
     Console.ReadLine(); 
    } 

    private static string pinvokePath(Guid guid, KnownFolderFlag flags) 
    { 
     IntPtr pPath; 
     SHGetKnownFolderPath(guid, (uint)flags, IntPtr.Zero, out pPath); // public documents 

     string path = System.Runtime.InteropServices.Marshal.PtrToStringUni(pPath); 
     System.Runtime.InteropServices.Marshal.FreeCoTaskMem(pPath); 
     return path; 
    } 
} 

을 사용하고 있습니다 그리고 당신은 다음과 같은 것을 호출 할 수 수행 할 작업 :

var folder = KnownFolderFinder.GetFolderFromKnownFolderGUID(new Guid("374DE290-123F-4565-9164-39C4925E467B"); 
-2

난 당신이 Environment.SpecialFolder (System 네임 스페이스)를 찾고 생각 :

https://msdn.microsoft.com/en-us/library/system.environment.specialfolder(v=vs.110).aspx

// Sample for the Environment.GetFolderPath method 
using System; 

class Sample 
{ 
    public static void Main() 
{ 
Console.WriteLine(); 
Console.WriteLine("GetFolderPath: {0}", 
      Environment.GetFolderPath(Environment.SpecialFolder.System)); 
} 
    } 
/* 
This example produces the following results: 

GetFolderPath: C:\WINNT\System32 
*/ 
+1

"나는 디렉토리의 위치를 ​​확인 할을/폴더에 ID로. " 당신의 폴더 ID는 ... –

+2

"입니다. 그러나 유일한 방법이 아니라면이 작업을 수행하고 싶지는 않을 것입니다. 내가 원하는 것을 올바르게 얻을 수있는 다른 방법이 있습니까? –

+2

"* 따라서 ID를 하드 코딩하여 *처럼 보이게 할 수는 있지만, 유일한 방법이 아니면 않는 것이 좋습니다." <--- 그가 싫어하는 것이 굵은 글씨입니다. 질문의 제목은 "ID로 알려진 폴더의 위치"입니다. 그것은 꽤 모호합니다. –

관련 문제