在我的机器上,它在这里:
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;