如何确定Windows"下载文件夹"路径?

mac*_*nir 22 c# windows

在我的机器上,它在这里:

string downloadsPath = Path.Combine(
   Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
   "Downloads");
Run Code Online (Sandbox Code Playgroud)

但在同事机器上,此文件夹不存在,他的"下载"文件夹位于"我的文档"文件夹中.我们都在Windows 7*上.

*编辑:事实上,事实证明他没有在自己的机器上运行应用程序,而是Windows Server 2003机器.

Dav*_*nan 22

Windows没有为"下载"文件夹定义CSIDL,并且无法通过Environment.SpecialFolder枚举来使用它.

但是,新的Vista 知名文件夹 API确实使用ID定义它FOLDERID_Downloads.获取实际值的最简单方法可能是P/invoke SHGetKnownFolderPath.

public static class KnownFolder
{
    public static readonly Guid Downloads = new Guid("374DE290-123F-4565-9164-39C4925E467B");
}

[DllImport("shell32.dll", CharSet=CharSet.Unicode)]
static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out string pszPath);

static void Main(string[] args)
{
    string downloads;
    SHGetKnownFolderPath(KnownFolder.Downloads, 0, IntPtr.Zero, out downloads);
    Console.WriteLine(downloads);
}
Run Code Online (Sandbox Code Playgroud)

请注意,pinvoke.net上给出的P/invoke不正确,因为它无法使用Unicode字符集.此外,我利用了这个API返回COM分配器分配的内存这一事实.上面的P/invoke的默认编组是释放返回的内存,CoTaskMemFree这对我们的需求是完美的.

请注意,这是一个Vista和更高版本的API,不要试图在XP/2003或更低版本上调用它.


小智 11

您可以使用适用于Microsoft .NET FrameworkWindows API代码包.

参考:Microsoft.WindowsAPICodePack.Shell.dll

需要以下命名空间:

using Microsoft.WindowsAPICodePack.Shell;
Run Code Online (Sandbox Code Playgroud)

用法简单:

string downloadsPath = KnownFolders.Downloads.Path;
Run Code Online (Sandbox Code Playgroud)