MFC:如何区分 "Save" 与 "Save As"?

MFC: how to differentiate "Save" vs "Save As"?

在我之前的问题 (MFC: how to change default file name for CFileDialog?) 中,我重载了 DoSave 函数以提供文件名建议。在这个函数中有什么方法可以区分 "Save" 和 "Save As"?因为我应该只弹出对话框 window 如果它是 "Save As".

BOOL CMyDoc::DoSave(LPCTSTR lpszPathName, BOOL bReplace)
{
    if (IsSaveAS() || m_saved_file_name.IsEmpty())
    {
        CString file_name = some_suggested_file_name;

        CFileDialog file_dialog(false, ..., file_name, ...);

        if (file_dialog.DoModal() == IDOK)
        {
            m_saved_file_name = file_dialog.GetPathName();
        }
    }

    OnSaveDocument(m_saved_file_name);

    return TRUE;
}

对话框应该在 lpszPathName == NULL || *lpszPathName == '[=13=]' 时弹出。

这涵盖了从 OnFileSaveAs 调用 DoSave 的情况:

void CDocument::OnFileSaveAs()
{
    if(!DoSave(NULL))
        TRACE(traceAppMsg, 0, "Warning: File save-as failed.\n");
}

还有关联文件为只读无法写入的情况

BOOL CDocument::DoFileSave()
{
    DWORD dwAttrib = GetFileAttributes(m_strPathName);
    if (dwAttrib & FILE_ATTRIBUTE_READONLY)
    {
        // we do not have read-write access or the file does not (now) exist
        if (!DoSave(NULL))
        {
            TRACE(traceAppMsg, 0, "Warning: File save with new name failed.\n");
            return FALSE;
        }
    }
    else
    {
        if (!DoSave(m_strPathName))
        {
            TRACE(traceAppMsg, 0, "Warning: File save failed.\n");
            return FALSE;
        }
    }
    return TRUE;
}

也符合内置逻辑DoSave

BOOL CDocument::DoSave(LPCTSTR lpszPathName, BOOL bReplace)
    // Save the document data to a file
    // lpszPathName = path name where to save document file
    // if lpszPathName is NULL then the user will be prompted (SaveAs)
    // note: lpszPathName can be different than 'm_strPathName'
    // if 'bReplace' is TRUE will change file name if successful (SaveAs)
    // if 'bReplace' is FALSE will not change path name (SaveCopyAs)
{
    CString newName = lpszPathName;

    if (newName.IsEmpty())
    {
        // ...
        if (!AfxGetApp()->DoPromptFileName(newName,
    // ...