初始目录不适用于 CFileDialog

Posted

技术标签:

【中文标题】初始目录不适用于 CFileDialog【英文标题】:Initial directory is not working for CFileDialog 【发布时间】:2013-04-23 08:35:15 【问题描述】:

我正在使用 CFileDialog,我已经设置了如下所示的初始路径,如代码所示。它不工作。如果我犯了错误,请纠正我。

   CFileDialog* filedlg = new CFileDialog(TRUE,(LPCTSTR)NULL ,  (LPCTSTR)NULL , OFN_HIDEREADONLY| OFN_ENABLESIZING , (LPCTSTR)NULL , FromHandle (hImgDlg) ,0 , FALSE  );

   filedlg ->m_ofn.lpstrInitialDir = "C:\\" ;

   if ( filedlg ->DoModal() == IDOK )
   
       /***  do somthing here *****/
   

【问题讨论】:

“不工作”是什么意思?你得到编译器错误吗?运行时错误或崩溃?初始目录不是您期望的那样? 不显示提到的初始路径它是自动采用最后选择的路径。 您使用的是 Windows 7(或更高版本)还是早期版本的 Windows? 另一种需要考虑的情况是 lpstrInitialDir 设置为不存在的文件夹。在这种情况下,Windows7 默认使用最近的文件夹。 【参考方案1】:

如果您看到OPENFILENAME 结构的引用,您会看到lpstrInitialDir 字段的声明如下:

如果lpstrInitialDir 的值与应用程序第一次使用OpenSave As 对话框时传递的值相同,则用户最近选择的路径将用作初始目录。

这意味着lpstrInitialDir 字段实际上只能在您第一次在程序中使用对话框时使用。其余时间它将使用用户最后选择的目录。

【讨论】:

还有其他替代 API 吗? @user948231 我不知道。 谢谢你@joachimileborg 我只是偶然发现了同样的问题。我真的很想知道导致这种奇怪行为的人吸了什么样的物质。 刚刚收到缺陷请求以修复我的程序中的此类行为,但不知道如何解决。【参考方案2】:

如果您设置文件名位置,您可以让对话框打开到特定位置。我只会在您确实需要打开文件夹位置或者您有使用的默认文件名时才使用它。

CFileDialog* filedlg = new CFileDialog(TRUE, (LPCTSTR)NULL,  (LPCTSTR)_T("C:\\MyFolder\\DefaultFileName.ext"), OFN_HIDEREADONLY | OFN_ENABLESIZING, (LPCTSTR)NULL, FromHandle (hImgDlg), 0, FALSE);

或者你可以使用 Windows 函数GetModuleFileName:

CString csAppFolder;
TCHAR szPath[MAX_PATH]; 

// form the path to where we want to store the file
if (GetModuleFileName(NULL, szPath, MAX_PATH))

    PathRemoveFileSpec(szPath);
    csAppFolder = szPath;


CFileDialog* filedlg = new CFileDialog(TRUE, (LPCTSTR)NULL, (LPCTSTR)(csAppFolder + _T("\\DefaultFileName.ext")), OFN_HIDEREADONLY | OFN_ENABLESIZING, (LPCTSTR)NULL, FromHandle (hImgDlg), 0, FALSE);

【讨论】:

您所建议的正是在 Windows 7 上无法正常工作的东西。 那么我必须做一些进一步的事情,让我每次打开目录时都能得到它。我不知道那会是什么。但是在实例化时指定实际文件名是可行的。它在生产中,我只在 Win 7 上开发。我想知道它为什么能工作。 为什么指定bVistaStyle=FALSE?在 Vista Style 对话框的情况下,指定 lpstrInitialDir 会有所帮助 我将不得不尝试一下,看看它对我的应用程序有何影响。谢谢。【参考方案3】:

两个选项: 1.老式对话框样式,指定OFN::lpstrInitialDir

CFileLatinDialog dlg (TRUE, "", "" /*lpszFileName */,
   OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
   "All Files(*.*)|*.*||", this, 0,
   FALSE /*bVistaStyle*/);
dlg.m_ofn.lpstrInitialDir = "C:\\Models\\";
    Vista 风格对话框,指定 lpszFileName 参数
CFileLatinDialog dlg (TRUE, "", "C:\\Models\\" /*lpszFileName */, OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, "所有文件(*.*)|*.*||", this);

【讨论】:

以上是关于初始目录不适用于 CFileDialog的主要内容,如果未能解决你的问题,请参考以下文章

React Native 初始项目不适用于 IOS

react-native-maps:animateToRegion 不适用于区域或初始区域?

iOS 应用程序初始屏幕方向不适用于横向

平滑滚动不适用于 Android RecyclerView 的初始滚动

静态初始化不适用于 c# 和 xaml

初始值不适用于 django-filters 上的 ChoiceField