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