我在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语句。
答案 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
}
谢谢大家的支持!