按修改时间重命名批处理(C++)

按修改时间重命名批处理(C++)实现步骤:

1.获取指定目录下所有文件文件名

2.获取所有文件创建时间,修改时间,访问时间

3.根据文件时间排序

4.根据排序重命名文件

1.获取指定目录下所有文件文件名 

std::vector<CString> Files;  //记录文件名
void GetPathFile(CString strDir)
{
	CFileFind tempFind;
	BOOL bFound = tempFind.FindFile(strDir + _T("*"),0);
	while(bFound)
	{
		bFound = tempFind.FindNextFile();
		CString strname=tempFind.GetFileName();
		//扩展名
		int Which=strname.ReverseFind('.');  
		CString ExtendName=strname.Right(strname.GetLength()-Which-1); 
		
		if(strname==_T(".")||strname==_T("..")||ExtendName!=m_fileex)
			continue;
		Files.push_back(FilePathstr+strname);
	}
	tempFind.Close();
}

2.获取所有文件创建时间,修改时间,访问时间

SYSTEMTIME stLocal,stLocal1,stLocal2;
void Getfiletime(CString strFilePath )
{
	FILETIME ftCreate, ftModify, ftAccess;
	CString strCreateTime, strModifyTime, strAccessTime;

	HANDLE hFile = CreateFile(strFilePath, GENERIC_READ,          // open for reading
		FILE_SHARE_READ,       // share for reading
		NULL,                            // default security
		OPEN_EXISTING,          // existing file only
		FILE_FLAG_BACKUP_SEMANTICS , // normal file
		NULL);

	if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftModify))
	{
		return ;
	}
   
	ZeroMemory(&stLocal, sizeof(SYSTEMTIME));
	FileTimeToSystemTime(&ftModify, &stLocal);//修改时间

	ZeroMemory(&stLocal1, sizeof(SYSTEMTIME));
	FileTimeToSystemTime(&ftCreate, &stLocal1);//创建时间

	ZeroMemory(&stLocal2, sizeof(SYSTEMTIME));
	FileTimeToSystemTime(&ftAccess, &stLocal2);//访问时间

	CloseHandle(hFile);
}
long long SystemTimeToSeconds(SYSTEMTIME& st)//将时间转换为秒
{
	CTime starttime(2000, 1, 1, 0, 0,0);
	CTime curtime(st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute,st.wSecond);  
	CTimeSpan sp = curtime - starttime; 
	long long iDay1 = sp.GetDays();
	long long iHour1 = sp.GetTotalHours();
	long long iMin1 = sp.GetTotalMinutes();
	long long iSec1 = sp.GetTotalSeconds();

	return  iSec1;//此处返回秒  
}

3.根据文件时间排序

void quick_Sort(long long *a, int *id, int m)//输出索引
{
	if ( m > 1)
	{
		int i = 0; 
		int j = m-1;
		int tmp = id[i];
		while(i<j)
		{
			while(j > i && a[id[j]] > a[tmp]) 
				--j;
			if (j > i)
				id[i++] = id[j];  //只改变索引顺序
			while(j > i && a[id[i]] < a[tmp])
				++i;
			if (j > i)
				id[j--] = id[i];  //只改变索引顺序
		}
		id[i] = tmp;
		quick_Sort(a, id, i);
		quick_Sort(a, id + i + 1, m - i - 1);
	}
}

4.根据排序重命名文件

BOOL RenameFile(CString strSrc, CString strNew)
{
	if (strSrc.IsEmpty() || strNew.IsEmpty())
		return FALSE;
	int nRet=0;
	try
	{
		CFile::Rename(strSrc, strNew);
	}
	catch(CFileException* pEx )
	{
		nRet=pEx->m_cause;
		TRACE(_T("File %20s not found, cause =%d\n"), strSrc,pEx->m_cause);
		pEx->Delete();
	}
	return nRet==0;
}

完整使用

void Batch()
{
	UpdateData(TRUE);
	Files.clear();
	GetPathFile(FilePathstr);//获取路径下指定类型的文件名
	long long *filetime=new long long[Files.size()*sizeof(long long)];
	memset(filetime,0,sizeof(long long));
	int *idx=new int[Files.size()*sizeof(int)];
	memset(idx,0,sizeof(int));
	for (int i=0;i<Files.size();i++)
	{
		Getfiletime(Files[i]);//获取时间
		switch (m_timeway)
		{
		case 0:
			filetime[i]=SystemTimeToSeconds(stLocal);//将时间转换为秒
			break;
		case 1:
			filetime[i]=SystemTimeToSeconds(stLocal1);
			break;	
		case 2:
			filetime[i]=SystemTimeToSeconds(stLocal2);
			break;
		default:
			filetime[i]=SystemTimeToSeconds(stLocal);
			break;
		}
		idx[i]=i;
	}
	
	quick_Sort(filetime,idx,Files.size());//排序输出索引
	if (m_direction==1)//索引反向
	{
		for(int i=0,m=Files.size()-1;i<Files.size()/2;i++,m--)
		{
			int j;
			j=idx[i];
			idx[i]=idx[m];
			idx[m]=j;
		}
	}
	BOOL FileFlase=TRUE;

	for (int i=0;i<Files.size();i++)
	{
// FilePathstr:路径  m_prefix:前缀  str:编号  m_fileex:扩展名
		CString str;str.Format(_T("%d"),i);
		CString pNewName=FilePathstr+m_prefix+str+_T(".")+m_fileex;
		FileFlase=RenameFile(Files[idx[i]], pNewName);
	}

	delete[] filetime;
	delete[] idx;
	Files.clear();
	if (FileFlase)MessageBox(_T("恭喜!您指定的操作,已经成功完成."));
	else MessageBox(_T("很遗憾!您指定的操作,发生了未知的错误."));
	
}

猜你喜欢

转载自blog.csdn.net/Mr_sandman1994/article/details/82705474