SHFileOperation + string???
我编写了一段代码,用于删除文件,删除部分如下:
void CClearVCPrjDlg::DeletePrjFiles(const std::string &strFinder)
{
CFileFind finder;
BOOL bWorking = finder.FindFile(strFinder.c_str());
std::string strFile;
while (bWorking)
{
bWorking = finder.FindNextFile();
ASSERT(!finder.IsDots());
ASSERT(!finder.IsDirectory());
strFile = finder.GetFilePath();
//strFile.resize(strFile.length() + 1, 0); <----加了这句SHFileOperation才会返回成功!!!
if (finder.IsReadOnly())
SetFileAttributes(strFile.c_str(), FILE_ATTRIBUTE_NORMAL);
m_sfo.pFrom = strFile.c_str();
if (SHFileOperation(&m_sfo) != 0)
{
finder.Close();
DWORD err = GetLastError();
std::stringstream strmErr;
strmErr << "删除文件(" << strFile << ")失败,错误码(" << err << ")";
MessageBox(strmErr.str().c_str(), "系统提示", MB_OK | MB_ICONERROR);
break;
}
}
finder.Close();
}
上面必须加“strFile.resize(strFile.length() + 1, 0); ”这句,SHFileOperation才会返回成功,否则就失败,错误码为6。这是为什么呢?c_str()返回的是以零为结尾的字符串吗?
如果加了“strFile.resize(strFile.length() + 1, 0); ”,最后的出错信息又会乱掉,例如:
删除文件F:\Temp\test.txt,出错后的提示信息应该为:
“删除文件(F:\Temp\test.txt)失败,错误码(6)”
加了“strFile.resize(strFile.length() + 1, 0); ”之后就变成了
“删除文件(F:\Temp\test.txt”
后面少了一段。
我正在学习C++,想尽量用string代替C风格的字符串,像SHFileOperation出现的这种问题,真是打击我的积极性啊。是不是用了跟API或MFC有关的代码都应该用C风格的字符串或MFC的CString呢?还是我什么地方写得不对?请大家指教。