最近在网上下载了100首世界名曲mp3文件,文件名不是真实的歌曲名,而是sjmq001,sjmq002,...,sjmq099。在网上找到了真实歌曲名后,想改成真实的歌曲名。100个文件挨个改的话要到什么时候。于是就有了写一个文件批量命名程序的想法。
歌曲文件放在G:\Workspace\src目录下,真实文件名文件是文本文件,也存放在该目录下。新建个目录G:\Workspace\dest,把重命名后的文件放在这个目录下。
功能实现:先调用dos命令dir 将G:\Workspace\src目录下的文件输出重定向到namelist.txt文件,读取该文件中的文件名到m_vecOldName向量中,再读取G:\Workspace\dest目录下的newname.txt到m_vecNewName中。再复制原歌曲文件到目标文件夹,用这两个向量中的值作为参数,调用rename命令,从而实现重命名。
现在直接上代码:
#ifndef TEST_H
#define TEST_H
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
#define SUFFIX ".MP3"
#define suffix ".mp3"
class MyUtil
{
public:
MyUtil(const string& src,const string& ini1,const string& ini2,const string& dest = "");
virtual ~MyUtil(void);
public:
void getOldNameVec(void);
void getNewNameVec(void);
bool rename(const string& oldname,const string& newname);
int renameAll(void);
void startProcess(void);
virtual void logging(const char* msg);
virtual void logging(const string& msg);
private:
string m_srcDir; //歌曲源目录
string m_destDir; //歌曲输出目录
string m_srcFile; //源歌曲名字列表文件
string m_destFile; //新歌曲名字列表文件
vector<string> m_vecOldName; //存放原名字的向量
vector<string> m_vecNewName; //存放新名字的向量
};
#endif
#include "stdafx.h"
#include "test.h"
MyUtil::MyUtil(const string& src,const string& ini1,const string& ini2,const string& dest)
:m_srcDir(src),m_destDir(dest),m_srcFile(ini1),m_destFile(ini2)
{
}
MyUtil::~MyUtil()
{
}
void MyUtil::logging(const char* msg)
{
cout << msg << endl;
}
void MyUtil::logging(const std::string &msg)
{
cout << msg << endl;
}
void MyUtil::getOldNameVec(void)
{
string dir_cmd = "dir " + m_srcDir + " > " + m_srcDir + "\\" + m_srcFile;
system(dir_cmd.c_str());
string path = m_srcDir + "\\" + m_srcFile;
ifstream in(path.c_str(),fstream::in | fstream::out);
string line,word;
while(getline(in,line))
{
if(line.find(suffix) != string::npos || line.find(SUFFIX) != string::npos) //
{
istringstream stream(line);
while(stream >> word)
{
if(word.find(suffix)!=string::npos || word.find(SUFFIX)!=string::npos)
{
m_vecOldName.push_back(word);
}
}
}
}
}
void MyUtil::getNewNameVec(void)
{
string path = m_destDir + "\\" + m_destFile;
ifstream in(path.c_str(),fstream::in | fstream::out);
string line,word;
while(getline(in,line))
{
istringstream stream(line);
while(stream >> word)
{
m_vecNewName.push_back(word);
}
}
in.close();
}
bool MyUtil::rename(const string& oldname,const string& newname)
{
string cmd = "rename " + oldname + " " + newname;
if( 0 == system(cmd.c_str()))
return true;
return false;
}
int MyUtil::renameAll(void)
{
size_t num1 = m_vecOldName.size();
size_t num2 = m_vecNewName.size();
size_t num = (num1 >= num2) ? num2 : num1;
string copy;
for(size_t i=0; i<num; i++)
{
copy = "copy " + m_srcDir + "\\" + m_vecOldName[i] + " " + m_destDir;
system(copy.c_str());
string oldname = m_destDir + "\\" + m_vecOldName[i];
string newname = m_vecNewName[i];
if(rename(oldname,newname))
{
string log = oldname + "----->" + newname + " succeeded";
logging(log);
}
else
{
string del = "del " + oldname;
system(del.c_str());
}
}
//
return num;
}
void MyUtil::startProcess(void)
{
getOldNameVec();
getNewNameVec();
renameAll();
}
namelist.txt 文件内容如下:
驱动器 G 中的卷是 资料
卷的序列号是 9036-6296
G:\Workspace\src 的目录
2012-08-17 14:49 <DIR> .
2012-08-17 14:49 <DIR> ..
2012-08-17 15:21 0 namelist.txt
2012-08-02 13:15 5,514,451 sjmq001.mp3
2012-08-02 13:15 1,641,743 sjmq002.mp3
2012-08-02 13:15 2,961,658 sjmq003.mp3
2012-08-02 13:15 3,529,665 sjmq004.mp3
2012-08-02 13:15 2,340,989 sjmq005.mp3
2012-08-02 13:16 12,102,327 sjmq006.mp3
2012-08-02 13:16 1,811,853 sjmq007.mp3
2012-08-02 13:16 3,690,161 sjmq008.mp3
2012-08-02 13:16 3,024,352 sjmq009.mp3
2012-08-02 13:16 2,590,928 sjmq010.mp3
11 个文件 39,208,127 字节
2 个目录 38,530,859,008 可用字节
newname.txt文件内容如下:
aaa.mp3 bbb.mp3 ccc.mp3 ddd.mp3 eee.mp3
fff.mp3
ggg.mp3
hhh.mp3
iii.mp3
jjj.mp3
程序运行结果见附件的图。
还可以有更好的方法来实现,因为本人水平有限,只为抛砖引玉。希望对看过这篇文章的人有所帮助,同时欢迎大家提出宝贵意见。在此谢过。