1.创建指定文件夹
BOOL CreateLeadoutPath( LPCTSTR lpPathName)
{
BOOL fRet = TRUE;
TCHAR szFileName[MAX_PATH] = { 0 };
TCHAR* lpChr = NULL;
TCHAR* lpHead = NULL;
if(lpPathName== NULL || *lpPathName== '\0')
{
return FALSE;
}
lstrcpyn(szFileName, lpPathName, sizeof(szFileName)-1);
lpHead = PathSkipRoot(szFileName);
while (true)
{
lpChr = _tcschr(lpHead, _T('\\'));
if (NULL == lpChr)
{
fRet &= CreateDirectory(szFileName, NULL);
if (!fRet && (GetLastError() == ERROR_ALREADY_EXISTS))
fRet = TRUE;
break;
}
else
{
*lpChr = NULL;
fRet &= CreateDirectory(szFileName, NULL);
if (!fRet && (GetLastError() == ERROR_ALREADY_EXISTS))
fRet = TRUE;
*lpChr = _T('\\');
lpHead = lpChr+1;
}
}
return fRet;
}
2.添加文件夹中文件全路径到vector中
void CFileTypeRecognitioner::get_all_files( CString folderpath, std::vector<CString>& files_vec )
{
CStringArray dirs;
CString filename;
CFileFind filefinder;
dirs.Add(folderpath);
BOOL bRet;
while(dirs.GetSize() > 0)
{
filename = dirs[0] + "\\*.*";
dirs.RemoveAt(0);
bRet = filefinder.FindFile(filename, 0);
while(bRet)
{
bRet = filefinder.FindNextFile();
if(filefinder.IsDots())
{
continue;
}
else if (filefinder.IsDirectory())
{
dirs.Add(filefinder.GetFilePath());
continue;
}
else
{
files_vec.push_back(filefinder.GetFilePath());
}
}
}
filefinder.Close();
}
3.清空文件夹
void DeleteFolder(CString sPath)
{
CFileFind ff;
BOOL bFound;
bFound = ff.FindFile(sPath + "\\*.* ");
while(bFound)
{
bFound = ff.FindNextFile();
CString sFilePath = ff.GetFilePath();
if(ff.IsDirectory())
{
if(!ff.IsDots())
DeleteFolder(sFilePath);
}
else
{
if(ff.IsReadOnly())
{
SetFileAttributes(sFilePath, FILE_ATTRIBUTE_NORMAL);
}
DeleteFile(sFilePath);
}
}
ff.Close();
SetFileAttributes(sPath, FILE_ATTRIBUTE_NORMAL);
}
4.在程序中调用其它exe程序。(实例为调用7z.exe进行解压缩)
TCHAR path[MAX_PATH];
::GetModuleFileName(NULL,path,MAX_PATH);
CString strExeRunPath;
strExeRunPath.Format("%s",path);
strExeRunPath = strExeRunPath.Left(strExeRunPath.ReverseFind('\\'));
//拼接需要传递的参数
CString strComline ;
strComline = "7z x -y -pa \"" + strSrcFullFilePath + "\" -o\"" + strDesDirPath + "\"";
char * pComline = strComline.GetBuffer(0);
strComline.ReleaseBuffer();
//调用7z
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi));
CString strTemp;
strTemp.Format("%s",pComline);
OutputDebugString("@@7z.exe参数:" + strTemp);
if(!CreateProcess(strExeRunPath + "\\7z.exe", pComline,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi))
{
OutputDebugString("创建解压进程失败");
return 3;
}
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
5.监视文件夹变化
//线程管理
DWORD WINAPI CFil::ThreadProc( LPVOID lParam )
{
//参数转换
CFil* objDlg = (CFil*)lParam;
//创建文件,打开目录,得到目录句柄
objDlg->m_hDir = CreateFile(objDlg->m_strPathName, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
//创建成功与否判断
if (objDlg->m_hDir == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// 获取监控的返回值
char bufTemp[(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH)*2];
FILE_NOTIFY_INFORMATION* pNotify = (FILE_NOTIFY_INFORMATION*)bufTemp;
DWORD dwReturn;
int Num=0; //显示记录条数
while (TRUE)
{
//检测目录发生变化
if (::ReadDirectoryChangesW(objDlg->m_hDir, pNotify, sizeof(bufTemp), true,
FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_ATTRIBUTES|FILE_NOTIFY_CHANGE_SIZE|
FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_LAST_ACCESS|
FILE_NOTIFY_CHANGE_CREATION|FILE_NOTIFY_CHANGE_SECURITY,
&dwReturn, NULL, NULL))
{
//获取当前时间
CTime time = CTime::GetCurrentTime();
CString strTime;
strTime.Format("%d:%d:%d", time.GetHour(), time.GetMinute(), time.GetSecond());
//获取变化的文件名
char strName[MAX_PATH];
memset(strName, 0, sizeof(strName) );
WideCharToMultiByte(CP_ACP, 0, pNotify->FileName, pNotify->FileNameLength/2, strName, 99, NULL, NULL);
//监视动作
switch (pNotify->Action)
{
case FILE_ACTION_ADDED: // The file was added to the directory
{
objDlg->m_list.InsertItem(0, objDlg->m_cNumber);
objDlg->m_list.SetItemText(0, 1, strTime);
objDlg->m_list.SetItemText(0, 2, "添加了文件");
objDlg->m_list.SetItemText(0, 3, strName);
break;
}
case FILE_ACTION_REMOVED: // The file was removed from the directory
{
objDlg->m_list.InsertItem(0, objDlg->m_cNumber);
objDlg->m_list.SetItemText(0, 1, strTime);
objDlg->m_list.SetItemText(0, 2, "删除了文件");
objDlg->m_list.SetItemText(0, 3, strName);
break;
}
case FILE_ACTION_MODIFIED: // The file was modified
{
objDlg->m_list.InsertItem(0, objDlg->m_cNumber);
objDlg->m_list.SetItemText(0, 1, strTime);
objDlg->m_list.SetItemText(0, 2, "修改了文件");
objDlg->m_list.SetItemText(0, 3, strName);
break;
}
case FILE_ACTION_RENAMED_OLD_NAME: // The file was renamed and this is the old name
{
objDlg->m_list.InsertItem(0, objDlg->m_cNumber);
objDlg->m_list.SetItemText(0, 1, strTime);
objDlg->m_list.SetItemText(0, 2, "重命名了文件");
objDlg->m_list.SetItemText(0, 3, strName);
break;
}
case FILE_ACTION_RENAMED_NEW_NAME: // The file was renamed and this is the new name
{
objDlg->m_list.InsertItem(0, objDlg->m_cNumber);
objDlg->m_list.SetItemText(0, 1, strTime);
objDlg->m_list.SetItemText(0, 2, "重命名了文件");
objDlg->m_list.SetItemText(0, 3, strName);
break;
}
default:
{
objDlg->m_list.InsertItem(0, objDlg->m_cNumber);
objDlg->m_list.SetItemText(0, 1, strTime);
objDlg->m_list.SetItemText(0, 2, "未发生变化");
objDlg->m_list.SetItemText(0, 3, strName);
break;
}
}
Num++;
objDlg->m_nNumber++; // 序号加一
itoa(objDlg->m_nNumber, objDlg->m_cNumber, 10); // 整型转换成字符型
}
else
{
break;
}
CString str;
str.Format("%d",Num);
str += "条记录";
objDlg->SetDlgItemText(IDC_STATIC_LOG,str);
}
return 0;
}