文件批量重命名C++实现

最近在网上下载了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

程序运行结果见附件的图。

还可以有更好的方法来实现,因为本人水平有限,只为抛砖引玉。希望对看过这篇文章的人有所帮助,同时欢迎大家提出宝贵意见。在此谢过。

猜你喜欢

转载自dennish001.iteye.com/blog/1636433