2016-09-16 4 views
11

Я хочу получить местоположение каталога/папки по его идентификатору.
Например, папка «Загрузка» имеет идентификатор knownfolder:{374DE290-123F-4565-9164-39C4925E467B}, когда я ввожу его в адресную строку проводника Windows, он перенаправляет мою папку загрузки.C# получить местоположение известной папки по ID

enter image description here

Существует список этих идентификаторов и соответствующих папок here, так что я мог бы жёстко идентификаторы и посмотреть их, как это, но я не хотел бы, чтобы это сделать, если его единственный путь.

Есть ли другой способ правильно получить то, что я хочу?

ответ

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 (система имен):

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

«Я хочу, чтобы получить расположение директории/папку по его идентификатору ". Ваш не принимает известный идентификатор папки ... –

+2

«но я бы не хотел этого делать, если только это не так. Есть ли другой способ правильно получить то, что я хочу?» –

+2

"*, чтобы я мог жестко задавать идентификаторы и искать их так: *, но я бы не хотел этого делать, если только это не единственный способ". <--- смелый - это то, что он не хотел бы делать. Название вопроса - «получить местоположение известной папки по идентификатору». Это довольно однозначно. –

Смежные вопросы