MFC 保存文件对话框



我正在编写一个MFC C++应用程序,该应用程序具有"另存为"按钮,用于将.txt文件保存到光盘。有了它,我正在尝试为文件覆盖添加额外的验证(如果存在具有相同文件名的文件,那么它应该查询用户是否要覆盖旧文件)。我已经用下面的代码尝试过这个,但它并没有真正起作用。当我在 MessageBox 上单击"否"时,它应该重新打开"另存为文件"对话框,但它给了我两个错误:第一个是 Debug assertion failed ,第二个是 Encountered an improper argument 。我应该如何做得更好?这是代码:

char strFilter[] = { "Text Files (*.txt)|*.txt|" }; 
    CFileDialog FileDlg(FALSE, CString(".txt"), NULL, 0, CString(strFilter)); 
    while(true)
    {
        if( FileDlg.DoModal() == IDOK ) // this is the line which gives the errors
        {
            agendaName = FileDlg.GetFileName(); //filename
            agendaPath = FileDlg.GetFolderPath(); //filepath (folders)
            if(model->agendaExists(CSToString(agendaPath+TEXT("\")+agendaName))) // there is another file called the same way
            {
                if(MessageBox(TEXT("A file with the specified name already exists. Overwrite?"), TEXT("File exists"), MB_YESNO) != 6) // user clicked NO (do not overwrite file)
                {
                    continue;
                }
            }
            model->sendToFile(CSToString(agendaPath+TEXT("\")+agendaName));  // the file is unique so the agenda named agendaName found at path agendaPath is saved
            return;
        }
    }

应该提到的是,错误发生在第 7 行,并且仅在通过while的第二个循环中发生。

>CFileDialog 可以自行检测文件是否存在并提示用户进行覆盖。

explicit CFileDialog(
   BOOL bOpenFileDialog,
   LPCTSTR lpszDefExt = NULL,
   LPCTSTR lpszFileName = NULL,
   DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
   LPCTSTR lpszFilter = NULL,
   CWnd* pParentWnd = NULL,
   DWORD dwSize = 0
);

只需传递OFN_OVERWRITEPROMPT即可获得旗帜。

至于你的问题,在调试器中运行,当你得到这个断言时,按"重试"按钮查看问题来自哪里(你可能还需要查看调用堆栈)。也许你应该尝试把它放在 while 循环中:

CFileDialog FileDlg(FALSE, CString(".txt"), NULL, 0, CString(strFilter)); 

您应该在构造函数中使用 OFN_OVERWRITEPROMPT 标志。该标志通常是默认标志之一,但您已将标志设置为 0。因此,如果您这样做:

CFileDialog FileDlg(FALSE, CString(".txt"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, CString(strFilter));
if (FileDlg.DoModal() == IDOK)  
{  
    model->sendToFile(CSToString(FileDlg.GetPathName()));
}

它应该有效。顺便说一下,GetPathName()获取所选文件的完整路径,因此您无需分 2 个步骤获取文件夹和文件名。

尝试在 while 循环中包含以下行(作为 while 循环中的第一行)

CFileDialog FileDlg(FALSE, CString(".txt"), NULL, 0, CString(strFilter));

此行位于代码中的 while 循环之外

相关内容

  • 没有找到相关文章

最新更新