按修改时间重命名批处理(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("很遗憾!您指定的操作,发生了未知的错误."));
}