c# - 如何确定 Windows 'Download folder' 路径?

标签 c# windows

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

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/

相关文章:

C#10 可为空模式 : how to tell the compiler I set the non-nullable property in the constructor indirectly?

c# - DateTimeOffset TotalHours 返回不同的值

c# - MEF 从网络共享文件夹加载插件

python - 如何在 Python 中将弹出窗口置于前台

c# - 只要我按下按钮,我怎样才能制作一个winform按钮 "do something"?

windows - 为什么使用IIS7.5的Microsoft.Web.Management.dll只能在64位进程中使用?

c# - Windows 安全弹出窗口出现在主应用程序窗口后面

windows - 在批处理脚本中执行目录列表时速度很慢

windows - 在 Windows 8 中安装 Apache Maven

C# 将 viewmodel 的属性传递给调度程序