1. 程式人生 > >C++批量修改檔名字

C++批量修改檔名字

為了實驗方便,需要為實驗資料檔案的名字新增一些標註。為了方便地新增或修改檔名標註,所以寫了這個程式。

實驗資料來自CMU Graphics Lav Motion Capture Database。

其中的檔名為:01_01.amc, 前兩位是兩個數字,代表這條運動資料的表演者。然後是下劃線。接著又是兩個數字,代表這個表演者表演的第幾個運動。檔案格式是amc。

由於一些原因,會導致檔名後邊會多出一些我們不想要的內容,我們要將這部分刪掉。同時,我們希望在這些檔名後邊加上一些標註,例如,將01_01.amc變為01_01_run.amc,方便我們直接從名字就能知道這條資料的內容。

思路是讀取一個資料夾,讀取下邊的檔案,讀取每一個檔案的名字,然後儲存進一個vector中。然後遍歷這個檔名vector,挨個修改名字。

#include <iostream>
#include <string>
#include <io.h>
#include <stdlib.h>
#include <vector>
using namespace std;

string dirpath = "E:\\gmmbayestb-v1.0\\motionData\\clusterData\\walk\\";

int main()
{
	_finddata_t file;
	long lf;
	char suffixs[] = "*.amc";          //要尋找的檔案型別
	vector<string> fileNameList;   //資料夾下.amc型別檔案的名字向量
	char *p;
	p = (char *)malloc((dirpath.size()+1)*sizeof(char));
	strcpy(p, dirpath.c_str());

	//獲取檔名向量
	if ((lf = _findfirst(strcat(p, suffixs), &file)) ==-1l)
	{
		cout<<"檔案沒有找到!\n";
	} 
	else
	{
		cout<<"\n檔案列表:\n";
		do {
			cout<<file.name<<endl;
			//str是用來儲存檔名的字串string
			string str(file.name);          
			fileNameList.push_back(str);           
			cout<<endl;
		}while(_findnext(lf, &file) == 0);
	}
	_findclose(lf);

	//遍歷檔名向量,並進行修改
	string strAdd = "_walk.amc";   //在原檔名的基礎上要增加的部分
	for (vector<string>::iterator iter = fileNameList.begin(); iter != fileNameList.end(); ++iter)      
	{
		string oldName = dirpath+*iter;
		//str1為原檔名要保留的部分
		string str1;
		str1 = (*iter).substr(0,5);
		string newName = dirpath+str1+strAdd;
		cout<<"oldName:"<<oldName<<endl;
		cout<<"newName"<<newName<<endl;

		cout<<"oldName size = "<<oldName.size()<<endl;
		cout<<"newName size = "<<newName.size()<<endl;
		
		char *oldNamePointer, *newNamePointer;
		oldNamePointer = (char *)malloc((oldName.size()+1) * sizeof(char));
		newNamePointer = (char *)malloc((newName.size()+1) * sizeof(char));
		strcpy(oldNamePointer, oldName.c_str());
		strcpy(newNamePointer, newName.c_str());
		cout<<oldNamePointer<<endl;
		cout<<newNamePointer<<endl;

		rename(oldNamePointer, newNamePointer);

		free(oldNamePointer);
		free(newNamePointer);
	}
	system("PAUSE");
	return 0;
}