在编译完FPGA的版本后,需要把bit文件和cdc发给其他人进行测试,由于两个文件和FPGA工程同名,每次都要重命名,加上今天的日期,便于版本控制。以上就是需求。于是想到要不要写个脚本,一键运行改名,最先想到的是用bat脚本,感觉没学过太麻烦,于是想到用c++,刚好最近在看string类相关的,于是花了点时间弄了一个控制台程序。代码如下:
//filesrename.cpp
#include <iostream>
#include<string>
#include<fstream>
#include<io.h>
#include<vector>
#include <time.h>
using namespace std;
bool IsExisteDirectory(string path)
{
if (-1 != _access(path.c_str(), 0))
{
return true;
}
return false;
}
void getFiles(string path, vector<string>& files)
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
}
else
{
//files.push_back(p.assign(path).append("\\").append(fileinfo.name));
files.push_back(fileinfo.name);
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
bool AlterFileName(string path,string filename, string newname)
{
filename = path + '\\' + filename;
newname = path + '\\' + newname;
//获取后缀
string suffix = "";
if (filename.rfind('.') != filename.npos)
{
suffix = filename.substr(filename.rfind('.'));
newname += suffix;
}
// int rename(char *oldname, char *newname);
// 更改文件名,成功返回0,否则返回-1
if (-1 == rename(filename.c_str(), newname.c_str()))
{
return false;
}
return true;
}
void main()
{
string path = _pgmptr;// exe文件所在目录,带*.exe
cout << path<< endl;
string newdir = "phl";
string m_strPath = path.substr(0, path.find_last_of('\\') + 1);// 给m_strPath赋初值
m_strPath += newdir;//新文件夹路径
if (!IsExisteDirectory(m_strPath))
{
string str = "md \"" + m_strPath + "\"";
//命令行操作md(make dir);\"代表双引号字符;md "D:\c++\filerename\filerename\Debug\phl"
system(str.c_str());//string 转成const cahr*
}
vector<string >files;
getFiles(m_strPath, files);//获取带后缀的文件名
//测试控制台
//string ip = "10.3.8.211";
//string p = "ping "+ip;
//system(p.c_str());
//获取系统时间
time_t rawtime;
time(&rawtime);
char pblgtime[20];
strftime(pblgtime, 20, "%Y_%m_%d", localtime(&rawtime));
cout << "strftime " << pblgtime << endl;
string data_str(pblgtime);
for (int i = 0; i < files.size(); i++)
{
if (AlterFileName(m_strPath, files[i], data_str) == 1)
cout << "rename success" << endl;
else
cout << "rename error" << endl;
}
}
简单介绍以下这个程序的功能,这个程序获取filesrename.exe所在的文件夹,判断这个文件夹下是否有一个文件夹“phl”,如果没有则创建之,然后获取“phl“文件夹下的所有文件名(包括后缀名),并存储起来,然后对这些文件进行命名,命名格式暂定为当前日期,同时保持后缀名不变。
这个程序包含了文件路径和文件名的获取,系统时间的获取,新建文件夹的操作,重命名的操作,以及字符串的相关操作。
参考内容有如下:
https://blog.youkuaiyun.com/jenny_84/article/details/44804141
https://www.cnblogs.com/anhuizhj/p/3806380.html
http://www.cjjjs.com/paper/xmkf/6272015363818304.aspx