2016-09-16 5 views
11

Ich möchte den Speicherort eines Verzeichnisses/Ordners anhand seiner ID ermitteln.
Zum Beispiel, der Ordner Downloads hat die ID knownfolder:{374DE290-123F-4565-9164-39C4925E467B}, wenn ich es in die Adressleiste des Windows Explorers eingeben, leitet es meine zu den Downloads-Ordner.C# den Speicherort des bekannten Ordners nach ID erhalten

enter image description here

Es gibt eine Liste dieser IDs und die entsprechenden Ordner here, so konnte ich die IDs codieren und sehen sie wie diese, aber ich würde nicht dieses, es sei denn es ist der einzige Weg machen wollen.

Gibt es einen anderen Weg, um richtig zu bekommen, was ich will?

Antwort

14

Stolen aus here. Bei diesem weiteren suchen, zu tun, die einzige Möglichkeit ist es ein WinAPI/PInvoke mit

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; 
    } 
} 

Und man könnte dann in etwa so nennen:

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

Ich glaube, Sie suchen Environment.SpecialFolder (System-Namespace):

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

„Ich habe die Lage eines Verzeichnisses bekommen/Ordner nach seiner ID. " Dein nimmt nicht die bekannte Ordner-ID ... –

+2

"aber ich würde das nicht tun wollen, es sei denn es ist der einzige Weg. Gibt es einen anderen Weg, um richtig zu bekommen, was ich will?" –

+2

"* damit ich die IDs fest codieren und sie so betrachten kann *, aber ich würde das nicht tun wollen, außer es ist der einzige Weg." <--- das Fett ist das, was er nicht tun möchte. Der Titel der Frage lautet "Ort des bekannten Ordners anhand der ID ermitteln". Es ist ziemlich eindeutig. –

Verwandte Themen