1.枚举所有文件夹(递归)
void EnumerateFolders ()
{
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile (_T ("*.*"), &fd); if (hFind != INVALID_HANDLE_VALUE) {
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
CString name = fd.cFileName;
if (name != _T (".") && name != _T ("..")) {
TRACE (_T ("%s\n"), fd.cFileName);
::SetCurrentDirectory (fd.cFileName);
EnumerateFolders ();
::SetCurrentDirectory (_T (".."));
}
}
} while (::FindNextFile (hFind, &fd));
::FindClose (hFind);
}
}
//比如说枚举E:\svn文件夹,不过可能会导致栈溢出
::SetCurrentDirectory(_T("e:\\svn"));
EnumerateFolders();
2.串行化类(版本控制http://www.vckbase.com/index.php/wv/1097)
class MyLine:public CObject
{
DECLARE_SERIAL(MyLine);
public:
MyLine(){};
MyLine(CPoint from,CPoint to){
m_ptFrom=from;
m_ptTo=to;
}
void Serialize(CArchive &ar);
protected:
CPoint m_ptFrom;
CPoint m_ptTo;
}; IMPLEMENT_SERIAL(MyLine,CObject,);
void MyLine::Serialize(CArchive &ar){ if(ar.IsLoading()){
ar<<m_ptFrom<<m_ptTo;
}else{
ar>>m_ptFrom>>m_ptTo;
}
}
下面是串行化输入输出demo:
void CMainWindow::OnFileWrite()
{
// TODO: 在此添加命令处理程序代码
CFile file(_T("abc.txt"),CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file,CArchive::store);
int i=;
float f=1.3f;
char ch='c';
CString str=_T("abc");
ar<<i<<f<<ch<<str;
} void CMainWindow::OnFileRead()
{
// TODO: 在此添加命令处理程序代码
CFile file(_T("abc.txt"),CFile::modeRead);
CArchive ar(&file,CArchive::load);
int i;
float f;
char ch;
CString str;
CString strResult;
ar>>i>>f>>ch>>str; //必须按顺序输出,也就是说存入的数据保持着原有的类型
strResult.Format(_T("%d,%f,%c,%s"),i,f,ch,str);
AfxMessageBox(strResult);
}