下载文件夹是一个所谓的“已知”文件夹,与文档、视频和其他文件夹一起。
不要:
- 组合硬编码路径段以检索已知文件夹路径
- 假设已知文件夹是用户文件夹的子文件夹
- 滥用长时间未使用的存储过时路径的注册表键
已知文件夹可以在其属性表中重定向到任何位置。我几年前在我的 CodeProject 文章中详细介绍了这一点。
要:
您可以像以下方式调用它(我仅提供了涵盖新用户文件夹的几个 GUID):
public enum KnownFolder
{
Contacts,
Downloads,
Favorites,
Links,
SavedGames,
SavedSearches
}
public static class KnownFolders
{
private static readonly Dictionary<KnownFolder, Guid> _guids = new()
{
[KnownFolder.Contacts] = new("56784854-C6CB-462B-8169-88E350ACB882"),
[KnownFolder.Downloads] = new("374DE290-123F-4565-9164-39C4925E467B"),
[KnownFolder.Favorites] = new("1777F761-68AD-4D8A-87BD-30B759FA33DD"),
[KnownFolder.Links] = new("BFB9D5E0-C6A9-404C-B2B2-AE6DB6AF4968"),
[KnownFolder.SavedGames] = new("4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4"),
[KnownFolder.SavedSearches] = new("7D1D3A04-DEBB-4115-95CF-2F29DA2920DA")
};
public static string GetPath(KnownFolder knownFolder)
{
return SHGetKnownFolderPath(_guids[knownFolder], 0);
}
[DllImport("shell32",
CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = false)]
private static extern string SHGetKnownFolderPath(
[MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags,
nint hToken = 0);
}
这是一个检索“下载”文件夹路径的示例:
string downloadsPath = KnownFolders.GetPath(KnownFolder.Downloads);
Console.WriteLine($"Downloads folder path: {downloadsPath}");
NuGet软件包
如果你不想自己进行p/invoke操作,请查看我的NuGet软件包(请注意,用法不同,请查看其自述文件)。
Environment.SpecialFolder
枚举?你尝试过path = Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Personal)); path = Path.Combine(path, "Downloads");
吗? - Kiquenet