下载文件夹是所谓的“已知”文件夹,与文档、视频等一起。
Do NOT:
- 组合硬编码路径段以检索已知文件夹路径
- 假设已知文件夹是用户文件夹的子文件夹
- 滥用长期不推荐使用的注册表项来存储过时的路径
已知文件夹可以重定向到其属性表中的任何位置。几年前我已经对此进行了更详细的介绍我的 CodeProject 文章.
Do:
- 使用WinAPI方法SHGetKnownFolderPath因为它是检索这些路径的预期且唯一正确的方法。
您可以按如下方式 p/invoke 它(我只提供了一些涵盖新用户文件夹的 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/调用自己,请看看我的NuGet包(注意用法不同,请查看其README)。