📄 myfilefind.cpp
字号:
#include "StdAfx.h"
#include ".\myfilefind.h"
#include <direct.h>
#include <io.h>
typedef struct _scanThread
{
CMyFileFind * pThis; //this 指针
char pszDir[_MAX_PATH]; //扫描的目录
int dir;
}ScanThread,*PScanThread;
typedef struct _OutThreadStruct
{
CMyFileFind * pThis; //this指针
CMyListCtrl * pDirList1; //输出到链表目录一文件概况
CMyListCtrl * pDirList2; //输出到链表目录二文件概况
int type; //输出的类型
}OutThread,*POutThread;
CMyFileFind::CMyFileFind(void)
{
m_hScanDir1=NULL; //扫描目录一的线程句柄
m_hScanDir2=NULL; //扫描目录二的线程句柄
m_hOut=NULL; //向面板上输出数据的句柄
}
CMyFileFind::~CMyFileFind(void)
{
//PreFreeList(1);
// PreFreeList(2);
}
void CMyFileFind::Search_Directory(char * szFileName,CString szDir,int dir)
{
i=0;
if(!::SetCurrentDirectory(szDir))
{
AfxMessageBox("设置目录失败,请确定目录是否存在或者目录后是否有/");
}
CFileFind fileFind;
CTime time;
BOOL bContinue;
bContinue=fileFind.FindFile("*.*");
while(bContinue)
{
bContinue=fileFind.FindNextFile();
if(fileFind.IsHidden())continue;
::GetCurrentDirectory(MAX_PATH,fileDir);
//strPath=fileFind.GetFilePath();
strPath.Format("%s",fileDir);
strName=fileFind.GetFileName();
//strPath.TrimRight(strName);
fileFind.GetLastWriteTime(time);
strWTime=time.Format("%Y年%m月%d日 %H:%M:%S");
fileFind.GetCreationTime(time);
strCTime=time.Format("%Y年%m月%d日 %H:%M:%S");
fileFind.GetLastAccessTime(time);
strATime=time.Format("%Y年%m月%d日 %H:%M:%S");
if(fileFind.IsDirectory())
{
i++;
if(i==3)
{
::GetCurrentDirectory(MAX_PATH,fileDir);
// fileFind.GetFilePath()
Search_Directory("*.*",fileFind.GetFilePath(),dir);
strCurr.Format("%s",fileDir);
if( !::SetCurrentDirectory(strCurr))
AfxMessageBox("设置目录失败,请确定目录格式是否正确");
}
}
else
{
if(dir==1)
{
//按查看两目录所有文件按纽执行输出到面板的函数
m_pMyListCtrl1->WriteListCtrl(strPath,strName,strCTime,strATime,strWTime);
//向目录一的相关链表中插入数
m_OneArray.Add(strPath);
m_OneArray.Add(strName);
m_OneArray.Add(strCTime);
m_OneArray.Add(strATime);
m_OneArray.Add(strWTime);
}
else if(dir==2)
{
//按查看两目录所有文件按纽执行输出到面板的函数
m_pMyListCtrl2->WriteListCtrl(strPath,strName,strCTime,strATime,strWTime);
//向目录二的相关链表中插入数据
m_TwoArray.Add(strPath);
m_TwoArray.Add(strName);
m_TwoArray.Add(strCTime);
m_TwoArray.Add(strATime);
m_TwoArray.Add(strWTime);
}
}
}
}
//查看目录一的线程
DWORD WINAPI CMyFileFind::_ScanThread(LPVOID lpParameter)
{
ScanThread *pScan=(ScanThread *)lpParameter;
pScan->pThis->Search_Directory("*.*",pScan->pszDir,pScan->dir);
if(pScan->dir==1)
{
// pScan->pThis->mutex[0]=1;
}
else
{
// pScan->pThis->mutex[1]=1;
}
return 0;
}
//把结果输出到面板上的线程
DWORD WINAPI CMyFileFind::_OutThread(LPVOID lpParameter)
{
return 0;
}
void CMyFileFind::StartScan(CString strDir1,
CString strDir2, //查找的目录二
CMyListCtrl *pMyListCtrl1, //把相关信息插入链表一
CMyListCtrl *pMyListCtrl2, //把相关信息插入链表二
CButton *pViewBtn, //查看不同的按纽
CButton *pCopyBtn) //复制最新文件的按纽
{
m_pMyListCtrl1=pMyListCtrl1;
m_pMyListCtrl2=pMyListCtrl2;
m_OneArray.RemoveAll();
m_TwoArray.RemoveAll();
m_pMyListCtrl1->DeleteAllItems();
m_pMyListCtrl2->DeleteAllItems();
m_pViewBtn=pViewBtn;
m_pCopyBtn=pCopyBtn;
AfxMessageBox(strDir1);
AfxMessageBox(strDir2);
Search_Directory("*.*",strDir1,1);
Search_Directory("*.*",strDir2,2);
}
//显示出不同
void CMyFileFind::ViewDiffer(int viewType) //不同的方式
{
int i=0;
int j=0;
m_pMyListCtrl1->DeleteAllItems();
m_pMyListCtrl2->DeleteAllItems();
switch(viewType)
{
case 0://根据名字
for(i=1;i<m_OneArray.GetCount();i=i+5) //从目录一中依次输出目录二中没有的文件
{
for(j=1;j<m_TwoArray.GetCount();j=j+5)
{
if(m_OneArray.GetAt(i).Compare(m_TwoArray.GetAt(j))==0)
break;
}
if(j>=m_TwoArray.GetCount())
{
m_pMyListCtrl1->WriteListCtrl(m_OneArray.GetAt(i-1),
m_OneArray.GetAt(i),m_OneArray.GetAt(i+1),m_OneArray.GetAt(i+2),m_OneArray.GetAt(i+3));
}
}
for(i=1;i<m_TwoArray.GetCount();i=i+5) //从目录二中依次输出目录一中没有的文件
{
for(j=1;j<m_OneArray.GetCount();j=j+5)
{
if(m_TwoArray.GetAt(i).Compare(m_OneArray.GetAt(j))==0)
break;
}
if(j>=m_OneArray.GetCount())
{
m_pMyListCtrl2->WriteListCtrl(m_TwoArray.GetAt(i-1),
m_TwoArray.GetAt(i),m_TwoArray.GetAt(i+1),m_TwoArray.GetAt(i+2),m_TwoArray.GetAt(i+3));
}
}
break;
case 1://根据创建时间
for(i=2;i<m_OneArray.GetCount();i=i+5)
{
for(j=2;j<m_TwoArray.GetCount();j=j+5)
{
if(m_OneArray.GetAt(i).Compare(m_TwoArray.GetAt(j))==0)
break;
}
if(j>=m_TwoArray.GetCount())
{
m_pMyListCtrl1->WriteListCtrl(m_OneArray.GetAt(i-2),
m_OneArray.GetAt(i-1),m_OneArray.GetAt(i),m_OneArray.GetAt(i+1),m_OneArray.GetAt(i+2));
}
}
for( i=2;i<m_TwoArray.GetCount();i=i+5)
{
for(j=2;j<m_OneArray.GetCount();j=j+5)
{
if(m_TwoArray.GetAt(i).Compare(m_OneArray.GetAt(j))==0)
break;
}
if(j>=m_OneArray.GetCount())
{
m_pMyListCtrl2->WriteListCtrl(m_TwoArray.GetAt(i-2),
m_TwoArray.GetAt(i-1),m_TwoArray.GetAt(i),m_TwoArray.GetAt(i+1),m_TwoArray.GetAt(i+2));
}
}
break;
case 2://根据访问时间
for(i=3;i<m_OneArray.GetCount();i=i+5)
{
for(j=3;j<m_TwoArray.GetCount();j=j+5)
{
if(m_OneArray.GetAt(i).Compare(m_TwoArray.GetAt(j))==0)
break;
}
if(j>=m_TwoArray.GetCount())
{
m_pMyListCtrl1->WriteListCtrl(m_OneArray.GetAt(i-3),
m_OneArray.GetAt(i-2),m_OneArray.GetAt(i-1),m_OneArray.GetAt(i),m_OneArray.GetAt(i+1));
}
}
for( i=3;i<m_TwoArray.GetCount();i=i+5)
{
for(j=3;j<m_OneArray.GetCount();j=j+5)
{
if(m_TwoArray.GetAt(i).Compare(m_OneArray.GetAt(j))==0)
break;
}
if(j>=m_OneArray.GetCount())
{
m_pMyListCtrl2->WriteListCtrl(m_TwoArray.GetAt(i-3),
m_TwoArray.GetAt(i-2),m_TwoArray.GetAt(i-1),m_TwoArray.GetAt(i),m_TwoArray.GetAt(i+1));
}
}
break;
case 3://根据修改时间
for(i=4;i<m_OneArray.GetCount()-5;i=i+5)
{
for(j=4;j<m_TwoArray.GetCount();j=j+5)
{
if(m_OneArray.GetAt(i).Compare(m_TwoArray.GetAt(j))==0)
break;
}
if(j>=m_TwoArray.GetCount())
{
m_pMyListCtrl1->WriteListCtrl(m_OneArray.GetAt(i-4),
m_OneArray.GetAt(i-3),m_OneArray.GetAt(i-2),m_OneArray.GetAt(i+1),m_OneArray.GetAt(i));
}
}
i=4;
j=4;
for(i=4;i<m_TwoArray.GetCount();i=i+5)
{
for(j=4;j<m_OneArray.GetCount();j=j+5)
{
if(m_TwoArray.GetAt(i).Compare(m_OneArray.GetAt(j))==0)
break;
}
if(j>=m_OneArray.GetCount())
{
m_pMyListCtrl2->WriteListCtrl(m_TwoArray.GetAt(i-4),
m_TwoArray.GetAt(i-3),m_TwoArray.GetAt(i-2),m_TwoArray.GetAt(i-1),m_TwoArray.GetAt(i));
}
}
break;
}
}
//拷贝不同的文件
void CMyFileFind::CopyNewFile(int copyType) //不同的方式
{
CString strMax;
int i=0;
int max1=0;
int max2=0;
switch(copyType)
{
case 1://拷贝创建时间最新的
max1=2;
strMax=m_OneArray.GetAt(2);
for(i=2;i<m_OneArray.GetCount();i+=5) //查找目录一中最新的文件
{
if(m_OneArray.GetAt(i).Compare(strMax)>0)
{
strMax=m_OneArray.GetAt(i);
max1=i;
}
}
max2=2;
strMax=m_TwoArray.GetAt(2);
for(i=2;i<m_TwoArray.GetCount();i+=5) //查找目录二中最新的文件
{
if(m_TwoArray.GetAt(i).Compare(strMax)>0)
{
strMax=m_TwoArray.GetAt(i);
max2=i;
}
}
if(m_OneArray.GetAt(max1).Compare(m_TwoArray.GetAt(max2))>0) //如果目录一中的最新文件比目录二中最新的文件
{
MyCopyFile(m_OneArray.GetAt(max1-2)+"\\"+m_OneArray.GetAt(max1-1),
m_TwoArray.GetAt(max2-2)+"\\"+m_OneArray.GetAt(max1-1));
}
else
{
MyCopyFile(m_TwoArray.GetAt(max1-2)+"\\"+m_TwoArray.GetAt(max1-1),
m_OneArray.GetAt(max2-2)+"\\"+m_TwoArray.GetAt(max1-1));
}
break;
case 2://拷贝访问时间最新的
max1=3;
strMax=m_OneArray.GetAt(3);
for(i=3;i<m_OneArray.GetCount();i+=5)
{
if(m_OneArray.GetAt(i).Compare(strMax)>0)
{
strMax=m_OneArray.GetAt(i);
max1=i;
}
}
max2=3;
strMax=m_TwoArray.GetAt(3);
for(i=3;i<m_TwoArray.GetCount();i+=5)
{
if(m_TwoArray.GetAt(i).Compare(strMax)>0)
{
strMax=m_TwoArray.GetAt(i);
max2=i;
}
}
if(m_OneArray.GetAt(max1).Compare(m_TwoArray.GetAt(max2))>0)
{
MyCopyFile(m_OneArray.GetAt(max1-3)+"\\"+m_OneArray.GetAt(max1-2),
m_TwoArray.GetAt(max2-3)+"\\"+m_OneArray.GetAt(max1-2));
}
else
{
MyCopyFile(m_TwoArray.GetAt(max1-3)+"\\"+m_TwoArray.GetAt(max1-2),
m_OneArray.GetAt(max2-3)+"\\"+m_TwoArray.GetAt(max1-2));
}
break;
case 3://拷贝修改时间最新的
max1=4;
strMax=m_OneArray.GetAt(4);
for(i=4;i<m_OneArray.GetCount()-5;i+=5)
{
if(m_OneArray.GetAt(i).Compare(strMax)>0)
{
strMax=m_OneArray.GetAt(i);
max1=i;
}
}
max2=4;
strMax=m_TwoArray.GetAt(4);
for(i=4;i<m_TwoArray.GetCount()-5;i+=5)
{
if(m_TwoArray.GetAt(i).Compare(strMax)>0)
{
strMax=m_TwoArray.GetAt(i);
max2=i;
}
}
if(m_OneArray.GetAt(max1).Compare(m_TwoArray.GetAt(max2))>0)
{
MyCopyFile(m_OneArray.GetAt(max1-4)+"\\"+m_OneArray.GetAt(max1-3),
m_TwoArray.GetAt(max2-4)+"\\"+m_OneArray.GetAt(max1-3));
}
else
{
MyCopyFile(m_TwoArray.GetAt(max1-4)+"\\"+m_TwoArray.GetAt(max1-3),
m_OneArray.GetAt(max2-4)+"\\"+m_TwoArray.GetAt(max1-3));
}
break;
}
}
//我的文件拷贝函数
//参数1源文件
//参数2目的文件
void CMyFileFind::MyCopyFile(CString FileOldPath, CString FileNewPath)
{
CFile fileOld;
CFile fileNew;
CString str="";
CString midStr="";
char Buffer[1000000]={0};
if(FileNewPath.GetLength()>MAX_PATH)
{
AfxMessageBox("对不起文件长度已经过长不能再拷贝");
}
fileOld.Open(FileOldPath,CFile::modeRead);
if(!fileNew.Open(FileNewPath,CFile::modeCreate|CFile::modeWrite))
{
AfxMessageBox(FileNewPath+"对不起你要拷贝的文件在新文件夹有重名");
}
try
{
UINT length;
length =(UINT)fileOld.GetLength();
fileOld.Read( Buffer, length);
fileNew.Write(Buffer,length);
fileNew.Close();
fileOld.Close();
}
catch (CFileException* e )
{
TRACE0(" CFileException caught");
throw e;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -