以下代码主要是用window api遍历文件,并对文件排序,然后依次处理数组中的文件,并清空,可以进行下一轮,主要用在文件夹不断写文件,然后这些文件需要处理的实际情况
struct FileInfo
{
TCHAR fileName[MAX_PATH];
FILETIME time_write;
static bool LessThan(FileInfo* a, FileInfo* b)
{//时间比较
int nTimeLess = CompareFileTime(&a->time_write, &b->time_write);
if (nTimeLess > 0)
return true;
else
return false;
return false;
//return CompareFileTime(&a->time_write,&b->time_write);
}
};
vector<FileInfo*> m_filesVec;//读取来的数据
int m_fileCount = 0;//寻找到的文件总数,可以在遍历时设置,比如大过300个文件,就先处理,也可以不处理,看实际需要
FindInAll("C:\\dir");
std::sort(m_filesVec.begin(), m_filesVec.end(), FileInfo::LessThan);
void FindInAll(LPCTSTR lpszPath)
{
TCHAR szFind[MAX_PATH];
lstrcpy(szFind, lpszPath);
if (!IsRoot(szFind))
lstrcat(szFind, _T("\\"));
lstrcat(szFind, _T("*.*")); // 找所有文件
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(szFind, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return;
do
{
if (wfd.cFileName[0] == '.')
continue; // 过滤这两个目录
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, _T("%s%s"), lpszPath, wfd.cFileName);
else
wsprintf(szFile, _T("%s\\%s"), lpszPath, wfd.cFileName);
FindInAll(szFile); // 如果找到的是目录,则进入此目录进行递归
}
else
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, _T("%s%s"), lpszPath, wfd.cFileName);
else
wsprintf(szFile, _T("%s\\%s"), lpszPath, wfd.cFileName);
wprintf(_T("%s\n"), szFile);
// 对文件进行操作
FileInfo *tmpFileInfo = new FileInfo();
wcscpy(tmpFileInfo->fileName, szFile);
tmpFileInfo->time_write = wfd.ftLastWriteTime;
m_filesVec.push_back(tmpFileInfo);
m_fileCount++;
if (m_fileCount > 300)
{
m_fileCount = 0;
LockQue(true);
bool thread_isExit = m_isExit;//退出线程标志 //如果不是在线程中这一段可不用,我是用在线程中的
LockQue(false);
if (thread_isExit==false)
{
FindClose(hFind); // 关闭查找句柄
return;
}
}
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄
}
void GetAllFiles()
{
//遍历文件
int nArraySixe = m_filesVec.size();
while (nArraySixe > 0)
{//依次取出所有数据
FileInfo* pItem = m_filesVec.at(nArraySixe - 1);
m_filesVec.pop_back();
if (pItem)
{//清内存
delete pItem;
}
nArraySixe = m_filesVec.size();
if (nArraySixe == 0)
{//清空
m_filesVec.clear();
std::vector<FileInfo*>().swap(m_filesVec);
}
}
}