2016-09-16 15 views
11

Bir dizinin/klasörün konumunu kimliğine göre almak istiyorum.
Örneğin, İndirilenler klasörü, Windows Gezgini'nin adres çubuğuna girdiğimde, knownfolder:{374DE290-123F-4565-9164-39C4925E467B} numaralı kimliğe sahip, benim indirilenler klasörüne yönlendiriyor.C# tanımadığı dizinin yerini ID ile alın

enter image description here

Orada bu kimlikleri ve ilgili klasörlere here listesidir, bu yüzden kimliklerini kodlar ve bu gibi onları aramak, ama ben onun tek yolu sürece bunu yapmak istemem başladı.

İstediğimi düzgün şekilde elde etmenin başka bir yolu var mı?

cevap

14

Çalıntı here dan. Bu ayrıca, tek yol baktığımızda bir WinAPI/Pınvoke

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

kullanıyor Ve sonra böyle bir şey diyebiliriz yapmak:

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

Sana Environment.SpecialFolder (Sistem Ad Alanı) aradığınız düşünüyorum:

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

"Ben bir dizinin konumunu almak istiyorum/kimliğine göre klasör. " Sizinki bilinmeyen klasör kimliğini almaz ... –

+2

"Ama bunu tek yolu sürece yapmak istemezdim. İstediğimi düzgün bir şekilde elde etmenin başka bir yolu var mı?" –

+2

"* Bu yüzden ID'leri kodlayabilirim ve onlara böyle bakabilirim *, ama bunu tek yolu olmadıkça yapmak istemem." <--- Cesurca yapmak istemediği şeydi. Sorunun başlığı "kimliğine göre bilinen klasörün yerini al". Oldukça açık değil. –