CFile返回调试断言

时间:2016-01-19 13:47:11

标签: c++ visual-studio-2013 mfc migrate cfile

我在Visual C ++中有一个旧项目,我正在尝试将其迁移到Visual Studio 2013.当我验证是否存在txt文件时,CFile会返回调试断言错误。代码是:

if (!txt_file.Open(txt_name,    CFile::modeWrite | CFile::shareDenyWrite  | CFile::typeText))
{
    //action if the file exists
}

问题是什么,我做错了什么? 谢谢

L.E。 :

txt_file在班级CStdioFile txt_file中声明为:trace txt_name在类private CString txt_name中名为open_file的方法中声明为:trace 方法open_file包含返回调试断言错误的if语句。

2 个答案:

答案 0 :(得分:0)

您可能正在使用:

CFile txt_file;

CFile不支持文字模式。

要在文字模式下打开,您可以更改为:

CStdioFile txt_file;

这应该可以解决问题(至少在这种情况下使用CFile生成一个断言)。

如果您已经使用CStdioFile,那么开放模式的(组合)可能存在问题。作为测试,请尝试删除CFile::shareDenyWrite。也可能存在安全限制。

  

mfc \ filecore.cpp行:179

最好使用调试器逐步完成它,或者查看filecore.cpp Line: 179以查看在那里检查的内容(我会为您查找,但不要使用Visual Studio 2013现在就在手边 - 可能是开放模式。)

<强>更新

  

这是第179行:

     

// shouldn't open an already open file (it will leak)

     

ASSERT(m_hFile == INVALID_HANDLE_VALUE);

该文件已经打开。所以不需要再打开它,或者首先需要关闭,以其他开放模式打开。

txt_file.Close();

或者测试文件是否已打开(对CMemFile无效):

if (txt_file.m_hFile != CFile::hFileNull) { // file already open
    txt_file.Close();
}

答案 1 :(得分:0)

解决了!

我没有使用问题中的代码来检查文件是否存在,而是使用了以下代码:

  CFileStatus sts; //status flag
        bool chkifFileExists = CFile::GetStatus(txt_name, sts); // return TRUE if the file exists else return false




        if (!(chkifFileExists))

{
 //do something
}

谢谢大家的支持!