FileObject.h #pragma once #include <string> #include <vector> using namespace std ; #ifdef _UNICODE #define stdTstring wstring #else #define stdTstring string #endif typedef enum { FILETYPE_NULL = 0, FILETYPE_FILE, FILETYPE_DIR, }FILETYPE; #define FILEATTRIBUTE_NULL 0x00000000 #define FILEATTRIBUTE_READONLY 0x00000001 #define FILEATTRIBUTE_HIDE 0x00000010 #define FILEATTRIBUTE_DIRECTORY 0x00000100 class CFileObject { public: virtual ~CFileObject(void); CFileObject(FILETYPE type,stdTstring FileName); private: stdTstring mFileName; FILETYPE mFileType; public: void SetFileName(stdTstring name); stdTstring GetFileName(void); FILETYPE GetFileType(); vector<CFileObject*> mSubFiles; }; FileObject.cpp #include "StdAfx.h" #include "FileObject.h" CFileObject::CFileObject(FILETYPE type,stdTstring FileName) : mFileName(FileName) , mFileType(type) { mSubFiles.clear(); } CFileObject::~CFileObject(void) { vector<CFileObject*>::iterator iter = mSubFiles.begin(); for (;iter!= mSubFiles.end(); iter++) { if ((*iter)) { CFileObject* file = (*iter); delete file; file = NULL; *iter = NULL; } } mSubFiles.clear(); } void CFileObject::SetFileName(stdTstring name) { mFileName = name; } stdTstring CFileObject::GetFileName(void) { return mFileName; } FILETYPE CFileObject::GetFileType() { return mFileType; } main.cpp // ListFile.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<Windows.h> #include "FileObject.h" #include "tinyxml.h" #include <time.h> bool EnumFiles(LPCTSTR DirName,CFileObject &Root) { WIN32_FIND_DATA FindFileData; ZeroMemory(&FindFileData,sizeof(WIN32_FIND_DATA)); HANDLE hFind = INVALID_HANDLE_VALUE; stdTstring dir = stdTstring(DirName); if (dir[dir.length()-1] != '//') { dir = dir + _T("//"); } stdTstring Find = dir + _T("*.*"); BOOL bFindResult = TRUE; hFind = ::FindFirstFile(Find.c_str(), &FindFileData); DWORD dwError; if (hFind == INVALID_HANDLE_VALUE) { return false; } else { while(bFindResult) { if ( !_tcscmp(FindFileData.cFileName,_T(".")) || !_tcscmp(FindFileData.cFileName,_T(".."))) { bFindResult = ::FindNextFile(hFind, &FindFileData); continue; } else { if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { stdTstring FullPath = dir + stdTstring(FindFileData.cFileName); CFileObject *obj = new CFileObject(FILETYPE_DIR,FullPath); EnumFiles(FullPath.c_str(),(*obj)); Root.mSubFiles.push_back(obj); } else { stdTstring FullPath = dir + stdTstring(FindFileData.cFileName); CFileObject *obj = new CFileObject(FILETYPE_FILE,FullPath); Root.mSubFiles.push_back(obj); } } bFindResult = ::FindNextFile(hFind, &FindFileData); } dwError = GetLastError(); ::FindClose(hFind); if (dwError != ERROR_NO_MORE_FILES) { _tprintf (TEXT("FindNextFile error. Error is %u./n"), dwError); return false; } } return true; } bool WriteToFile(CFileObject &Root) { return true; } int _tmain(int argc, _TCHAR* argv[]) { time_t starttime; time(&starttime); DWORD star = GetTickCount(); CFileObject obj(FILETYPE_DIR,_T("C://")); EnumFiles(_T("C://"),obj); time_t endTime; time(&endTime); DWORD t = GetTickCount() - star; time_t deleta = endTime - starttime; return 0; } 这样写后遍历C盘下文件需要8秒..... 寻求更效率的解决方案!