2016-09-16 12 views
11

Tôi muốn lấy vị trí của một thư mục/thư mục theo ID của nó.
Ví dụ: thư mục Tải xuống có ID knownfolder:{374DE290-123F-4565-9164-39C4925E467B}, khi tôi nhập nó vào thanh địa chỉ của trình khám phá cửa sổ, nó chuyển hướng thư mục của tôi đến thư mục tải xuống.C# lấy vị trí của thư mục đã biết bằng ID

enter image description here

Có một danh sách các ID này và các thư mục tương ứng here, vì vậy tôi có thể hardcode các ID và tìm kiếm chúng lên như thế này, nhưng tôi wouldnt muốn làm điều này trừ khi cách duy nhất của nó.

Có cách nào khác để có được đúng những gì tôi muốn không?

Trả lời

14

bị đánh cắp từ here. Nhìn xa hơn, cách duy nhất này để làm điều đó là sử dụng một 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; 
    } 
} 

Và sau đó bạn có thể gọi một cái gì đó như thế này:

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

Tôi nghĩ rằng bạn đang tìm kiếm Environment.SpecialFolder (Hệ thống không gian tên):

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

"Tôi muốn để có được vị trí của một thư mục/bằng ID của nó. " Bạn không lấy ID thư mục đã biết ... –

+2

"nhưng tôi không muốn làm điều này trừ khi đó là cách duy nhất. Có cách nào khác để có được những gì tôi muốn không?" –

+2

"* vì vậy tôi có thể mã hóa các ID và xem chúng như thế này *, nhưng tôi không muốn làm điều này trừ khi nó là cách duy nhất." <--- đậm là những gì anh ta không muốn làm. Tiêu đề của câu hỏi là "lấy vị trí của thư mục đã biết bằng ID". Nó khá rõ ràng. –

Các vấn đề liên quan