如何将OpenFileDIalog上的初始目录设置为C#中的用户“下载”文件夹

本文关键字:用户 文件夹 下载 设置 OpenFileDIalog | 更新日期: 2023-09-27 18:28:07

好的,所以我有一个OpenFileDialog,我想将初始目录设置为用户的"下载"文件夹。这是一个内部应用程序,因此,我确信用户将使用Windows7。

var ofd = new OpenFileDialog();
//This doesn't work
ofd.InitialDirectory =
    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Downloads");
//This doesn't work either
ofd.InitialDirectory = @"%USERPROFILE%'Downloads";
ofd.Filter = "Zip Files|*.zip";
ofd.ShowDialog();
txtFooBar.Text = ofd.FileName;

到目前为止,我已经尝试过上述方法,但都不起作用。没有抛出异常,只是没有将初始目录设置为下载文件夹。

我哪里错了?

感谢

如何将OpenFileDIalog上的初始目录设置为C#中的用户“下载”文件夹

我可以使用环境直接调用,但我必须在末尾添加ToString()。直到我添加它才起作用。

saveFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

也许这会有所帮助:https://stackoverflow.com/a/1175250/333404

更新

适用于我:https://stackoverflow.com/a/3795159/333404

  private void Button_Click_1(object sender, RoutedEventArgs e) {
            var ofd = new OpenFileDialog();
            ofd.InitialDirectory = GetDownloadsPath();
            ofd.Filter = "Zip Files|*.zip";
            ofd.ShowDialog();
        }
        public static string GetDownloadsPath() {
            string path = null;
            if (Environment.OSVersion.Version.Major >= 6) {
                IntPtr pathPtr;
                int hr = SHGetKnownFolderPath(ref FolderDownloads, 0, IntPtr.Zero, out pathPtr);
                if (hr == 0) {
                    path = Marshal.PtrToStringUni(pathPtr);
                    Marshal.FreeCoTaskMem(pathPtr);
                    return path;
                }
            }
            path = Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Personal));
            path = Path.Combine(path, "Downloads");
            return path;
        }
        private static Guid FolderDownloads = new Guid("374DE290-123F-4565-9164-39C4925E467B");
        [DllImport("shell32.dll", CharSet = CharSet.Auto)]
        private static extern int SHGetKnownFolderPath(ref Guid id, int flags, IntPtr token, out IntPtr path);

Downloads文件夹有一个本地化的名称,无论如何,假设一个众所周知的文件夹(即使它有很好的文档)的特定相对位置都不是一个好主意,因为用户设置也可能会更改它。

不幸的是,SpecialFolder枚举并没有包含所有已知的文件夹,因此您必须使用一点互操作,请参阅MSDN。从该页面中,我们可以找到已知文件夹的完整列表,您要查找的是FOLDRID_Downloads,因为SHGetKnownFolderPath函数需要一个GUID,您必须在该常量的某个位置声明该GUID。你的代码会是这样的:

static class ShellHelpers
{
 public static string GetDownloadsFolder()
 {
  string path;
  int result = SHGetKnownFolderPath(FOLDERID_Downloads, 0, IntPtr.Zero, out path);
  if (result != NOERROR)
   Marshal.ThrowExceptionForHR(result); // You may fallback to another method or folder
  return path;
 }
 private static readonly Guid FOLDERID_Downloads = new Guid("374DE290-123F-4565-9164-39C4925E467B");
 private static readonly int NOERROR = 0;
 [DllImport("shell32.dll", CharSet=CharSet.Unicode)]
 private static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out string pszPath);
}

请注意,您可以使用您喜欢的p/Invoke签名(有人使用StringBuilder,其他人使用IntPtr)

我使用了@tim的答案,结果很好。只有我在没有ToString()方法的情况下使用了它,并直接使用了Path.Combine()方法。

private OpenFileDialog openFileDialog;
openFileDialog.InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads");

Environment.GetEnvironmentVariable("USERPROFILE")+@"quot;+"下载";

尝试这个

ofd.InitialDirectory = @"%USERPROFILE%'My Documents'Downloads";