今天为了把一个文件中的数据分成多份子文件我写了一个小的功能,为了能方便对分块后的数据进行统一的管理我对子文件采用的命名方式是:父文件名+_文件编号.后缀。这个功能应该是十分简单的但是却花费了好几个小时的时间而且还丈二和尚的感觉。原因就是我处理后的文件名CString变量一直不对,它只使用了父文件名,而没有按照原本设计的方式包含子文件编号及文件扩展名。我当时的代码如下:
PathRemoveExtension((LPSTR)(LPCTSTR)m_SelectedToCutFile);//去掉后缀名
PathStripPath((LPSTR)(LPCTSTR)m_SelectedToCutFile);//获取无扩展名的文件名
CString oriFileName(m_SelectedToCutFile);
CString oneFilePath=m_SelectedFolderForCut+_T("\\")+oriFileName;//①这里字符没错(如:”C:\Folder\大数据”)
for (int fileNum=1,i=0,UPPERBOUND=modelsPos.size();;fileNum++)
{
CString fileNumCStr;
fileNumCStr.Format("%d",fileNum);
fileNumCStr=CString("_")+fileNumCStr+CString(".xyz");//②这里的字符没错(如:”_1.xyz”)
oneFilePath+=fileNumCStr;//③这里字符串相加没成功(错误输出为如:”C:\Folder\大数据”)
……
}
上面的状况我各种检查就是百思不得其解,明明就没有错误啊!!虽然以前曾遇到两个CString相加报错说是:不能两个指针相加的情况,但是这样的错误我还是第一次遇到的。于是我开始大量的百度了,百度到也有相关的问题的描述:http://bbs.csdn.net/topics/330094029:
但是纵观整个跟帖的都不能找到一个可靠的解决方法,郁闷啊。不过无意间看到这个博客: http://blog.sina.com.cn/s/blog_70441c8e0100snah.html里面大约是对CString的内部机理进行的讲解,而且指出了两种常见的错误,其中他的第二条就很好的说明了我的问题。 LPCSTR 处理后的CString,类似于对CString进行了GetBuffer处理一样。咦,这句话就是重点了。于是我修改了下我的代码如下:
PathRemoveExtension((LPSTR)(LPCTSTR)m_SelectedToCutFile);
m_SelectedToCutFile.ReleaseBuffer();//释放buffer
PathStripPath((LPSTR)(LPCTSTR)m_SelectedToCutFile);
m_SelectedToCutFile.ReleaseBuffer();//释放buffer
CString oriFileName(m_SelectedToCutFile);
CString oneFilePath=m_SelectedFolderForCut+_T("\\")+oriFileName;
问题就解决了。
其实我们经常在处理CString转Char*时只GetBuffer了而没有Release,虽然一般情况不会出错但是这样的确不是好的习惯,容易引起错误。当然这个地方的错误感觉稍微有点隐蔽,以前没有注意过。同样刚才提到的那个帖子的情况应该也是这样的。