关于MFC的CFileDialog类的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于MFC的CFileDialog类的问题相关的知识,希望对你有一定的参考价值。

CFileDialog dlg(FALSE,NULL,sFileName,0);
if(dlg.DoModal() == IDOK)


CString strFile = dlg.GetPathName(); // 全路径
int count = 1;
while( count )

if( DetectionFileExists(strFile) )//DetectionFileExists()检测某个文件,存在返回TRUE,不存在返回FLASE
int i = MessageBox("已经有同名文件存在,覆盖原文件?","提示",MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2) ;

if( i == 6 )

CFile::Remove(strFile); count = 0;
if( i == 7 )
MessageBox("IDON");

/////////////////////////////////////////////////////////////////////////////////////////
我做了一个保存文件的对话框,里面有检测保存的文件是否存在的功能。如果文件存在就提示用户是否覆盖文件,问题就出在这里,用户选在了否 if( i == 7 )
MessageBox("IDON"); 这里怎么写才能回到对话框供用户从新选择路径,

太复杂,CFileDialog本来就有个文件同名提示选项,
CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );

OFN_OVERWRITEPROMPT?
参考技术A 问题是什么啊? 参考技术B 文件存在与否有FindFirstFile之类函数
干嘛用CFileDialog
参考技术C CFileDialog 打开多个文件2006-12-01 17:28从CFileDialog派生一个类MFileDlg: 头文件://///////////////////////////////////////////////////////////////////////////

// MFileDlg dialogclass MFileDlg : public CFileDialog



DECLARE_DYNAMIC(MFileDlg)public:

MFileDlg(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs

LPCTSTR lpszDefExt = NULL,

LPCTSTR lpszFileName = NULL,

DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

LPCTSTR lpszFilter = NULL,

CWnd* pParentWnd = NULL);

int DoModal();

virtual ~MFileDlg();

protected:

//AFX_MSG(MFileDlg)

// NOTE - the ClassWizard will add and remove member functions here.

//AFX_MSG TCHAR* m_pszFile;

////////

DECLARE_MESSAGE_MAP(); 类实现://///////////////////////////////////////////////////////////////////////////

// MFileDlgIMPLEMENT_DYNAMIC(MFileDlg, CFileDialog)MFileDlg::MFileDlg(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,

DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :

CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)



m_pszFile = new TCHAR[2048]; //set a 2K buffer to hold selected files

m_pszFile[0] = '\0'; //initialize pointer;



BEGIN_MESSAGE_MAP(MFileDlg, CFileDialog)

//AFX_MSG_MAP(MFileDlg)

// NOTE - the ClassWizard will add and remove mapping macros here.

//AFX_MSG_MAP

END_MESSAGE_MAP()MFileDlg::~MFileDlg()



if (m_pszFile != NULL)

delete [] m_pszFile; //cleanup

int MFileDlg::DoModal()



ASSERT_VALID(this);

ASSERT(m_ofn.Flags & OFN_ALLOWMULTISELECT); //make sure multiple file selection is on m_ofn.lpstrFile = m_pszFile; //initialize the OPENFILENAME structure

m_ofn.nMaxFile = 2048;

return CFileDialog::DoModal();

具体使用: MFileDlg dlg( TRUE,_T("TXT"),_T("*.TXT"),

OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,

_T("文本文件 (*.txt)|*.txt所有文件 (*.*)|*.*|"));

if(dlg.DoModal()!=IDOK) return FALSE; //取消操作 POSITION pos = dlg.GetStartPosition();

while (pos != NULL)



CString strPath = dlg.GetNextPathName(pos);

if (strPath.Find(":\\\\") == 1 && strPath.GetLength() > 4)



// this means we have an invalid path that looks like this:

// C:\\cda.dgl

// get rid of extra slash

CString temp;

temp = strPath.Left(3);

temp += strPath.Mid(4);

strPath = temp;



m_listFileNames.AddTail(strPath); //CStringList m_listFileNames

TRACE(_T("GetOpenFileName returned %s Files\r\n"),strPath);

MFC CFileDialog 只打开选择文件

【中文标题】MFC CFileDialog 只打开选择文件【英文标题】:MFC CFileDialog open only select files 【发布时间】:2013-04-10 20:38:19 【问题描述】:

使用 CFileDialog 作为文件打开,我需要允许用户只选择显示在对话框列表区域中的文件,例如单击它。我们不希望用户能够在 File Name 控件中键入名称。 OPENFILENAME (OFN) 结构有几个不同的标志 (http://msdn.microsoft.com/en-US/library/ms646839%28v=vs.80%29.aspx),但我没有看到阻止用户输入文件名的标志。

我看到的最接近的是OFN_FILEMUSTEXIST,但它只指定文件存在;它仍然允许用户输入名称。

有什么方法可以在不继承新类的情况下做到这一点?

更多信息

我们需要防止他们输入文件名,因为他们可能会打开不合适的文件名。使用lpszFilter 参数,我们过滤文件名,因此它只显示文件名中带有 ABC 的文件(而不是扩展名)。因此,如果他们输入文件名,他们可以输入类似myCoolFileDEF.ext 的内容。如果文件存在,它将继续并让他们打开它(对话框将关闭而没有错误消息),即使他们只应该打开文件名中带有 ABC 的文件。

【问题讨论】:

【参考方案1】:

由于您使用的是 MFC,因此只需 inherit a CFileDialog and disable the file name edit control and combobox。我看不出使用 CFileDialog 和编写另一个 OFNHookProc 回调的意义,不过如果你愿意,你可以从 GetOpenFileName 开始。

【讨论】:

【参考方案2】:

作为先前的答案说明,您可以在对话框中查找文件名控件并将其禁用。不过,这并非没有惩罚 - 如果您打开 CFileDialog 挂钩回调逻辑,您会在 Vista 及更高版本上获得“旧样式”文件对话框,而不是“新样式”对话框。 “新样式”文件对话框对可自定义的内容有更多限制,据我所知,它不提供获取文件名控件的受支持方式。

阅读您的问题后,我的第一反应是您过度设计了您的解决方案:如果您提供了一个过滤器,那么用户必须费尽心思才能选择错误的文件类型,而大多数用户都赢了不要那样做。如果他们这样做,则用户可能比您的程序更了解。如果是我,我只会使用过滤器,然后在文件对话框关闭后,检查返回的文件名 - 如果它与所需的模式不匹配,我会发出一个消息对话框询问用户是否他们'非常确定,如果他们坚持要打开文件,无论如何都要打开。

【讨论】:

我同意 - 不过你比我更胜一筹!通过将验证逻辑放在文件名提示之后,您还可以重用它,例如验证在命令行或通过拖放提供的文件名。

以上是关于关于MFC的CFileDialog类的问题的主要内容,如果未能解决你的问题,请参考以下文章

MFC文件的读写操作,类的序列化与反序列化,CFile,CFileDialog,CArchive,CStdioFile

MFC CFileDialog的问题...

mfc CFileDialog类

MFC中CFileDialog使用方法

在 CFileDialog (MFC) 中设置文件夹视图

如何在 MFC 中使用 CfileDialog 选择特定文件