alene_cn 2004年12月24日
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呢?还是我什么地方写得不对?请大家指教。
...全文
48 点赞 收藏 2
写回复
2 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告