微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#通过ID获取已知文件夹的位置

我想通过它的ID来获取目录/文件夹的位置。

例如,Downloads文件夹的ID kNownfolder:{374DE290-123F-4565-9164-39C4925E467B}文件夹kNownfolder:{374DE290-123F-4565-9164-39C4925E467B} ,当我将其input到Windows资源pipe理器的地址栏中时,它将我redirect到下载文件夹。

在这里一个这些ID和相应的文件夹的列表,所以我可以硬编码的ID和像这样看,但我不想这样做,除非它的唯一途径。

有没有另一种方法来正确地得到我想要的?

Windows“已知文件夹”:是否有任何一个版本可以被所有用户可靠地读/写?

有没有在Windows中的特殊文件夹权威指南?

如何在32位应用程序中获得64位系统文件夹?

如何从Delphi中的已知文件夹GUID获取文件夹path

SHGetFolderPath不推荐使用什么替代方法来检索Windows文件夹的path?

从这里偷来的 进一步看,唯一的方法就是使用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");

我想你正在寻找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:WINNTSystem32 */

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐