在我的机器上,它在这里:
string downloadsPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
"Downloads");
但是在同事的机器上,这个文件夹不存在,他的下载文件夹在他的“我的文档”文件夹中。 我们都在 Windows 7 上*。
*编辑:事实上,他并不是在自己的机器上运行应用程序,而是在 Windows Server 2003 机器上运行。
最佳答案
Windows 没有为下载文件夹定义 CSIDL,并且它不能通过 Environment.SpecialFolder
枚举获得。
但是,新的 Vista Known Folder API 确实用 FOLDERID_Downloads
的 ID 定义了它。获取实际值的最简单方法可能是 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 或更低版本上调用它。
关于c# - 如何确定 Windows 'Download folder' 路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7672774/