Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将OpenFileDIalog上的初始目录设置为C中的users'Downloads'文件夹#_C#_Openfiledialog - Fatal编程技术网

C# 如何将OpenFileDIalog上的初始目录设置为C中的users'Downloads'文件夹#

C# 如何将OpenFileDIalog上的初始目录设置为C中的users'Downloads'文件夹#,c#,openfiledialog,C#,Openfiledialog,好的,我有一个OpenFileDialog,我想将初始目录设置为用户的“下载”文件夹。这是一个内部应用程序,因此,我确信用户将使用Windows7 var ofd = new OpenFileDialog(); //This doesn't work ofd.InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Downloads"); //Thi

好的,我有一个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;
到目前为止,我已经尝试了上述方法,但都没有效果。没有引发异常,只是没有将初始目录设置为downloads文件夹

我哪里做错了

谢谢

也许这会有帮助:

更新

为我工作:

试试这个

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

下载文件夹有一个本地化的名称,无论如何,假设一个已知文件夹的特定相对位置(即使它有很好的文档记录)并不是一个好主意,因为它也可能会被用户设置更改

不幸的是,
SpecialFolder
枚举没有包含所有已知文件夹,因此您必须使用一点互操作,请参阅。从该页面我们可以找到,您要查找的是FOLDERID_下载,因为该函数需要一个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)。

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

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

嗯,其他目录的工作正常,例如,Environment.GetFolderPath(Environment.SpecialFolder.Personal)工作正常,但当我进一步尝试时,初始目录只是恢复到我的C驱动器的根目录。抱歉可能重复,这对我来说非常有效。谢谢你,汉斯。我不会拒绝对我的评论所做的编辑,我会说,当我在2015年发布这篇文章时,我的编译器要求我使用ToString()来实现这个函数。在VS2019中,它可以正常工作。这就是我的经历,也是我发表评论的原因。
saveFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);