如何确定Windows的“下载文件夹”path?

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

string downloadsPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads"); 

但是在同事机器上,这个文件夹不存在,他的下载文件夹位于他的“我的文档”文件夹中。 我们都在Windows 7 *上。

* 编辑 :事实上,事实certificate,他不是在自己的机器上运行的应用程序,而是一台Windows Server 2003的机器。

Windows没有为Downloads文件夹定义CSIDL ,并且它不能通过Environment.SpecialFolder枚举来获得。

但是,新的Vista 已知文件夹 API确实使用FOLDERID_Downloads的ID进行了FOLDERID_Downloads 。 可能最简单的方法来获得实际值是P /调用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); } 

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

要小心这是一个Vista和以上的API,不要试图在XP / 2003或更低版本上调用它。

您可以使用Microsoft .NET Framework的Windows API代码包 。

参考: Microsoft.WindowsAPICodePack.Shell.dll

需要以下命名空间:

 using Microsoft.WindowsAPICodePack.Shell; 

简单的用法:

 string downloadsPath = KnownFolders.Downloads.Path;