C# 如何将OpenFileDIalog上的初始目录设置为C中的users'Downloads'文件夹#
好的,我有一个OpenFileDialog,我想将初始目录设置为用户的“下载”文件夹。这是一个内部应用程序,因此,我确信用户将使用Windows7C# 如何将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
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);