问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
在使用rename重命名文件时,直接类似这种
rename("D:\\BaiduNetdiskDownload\\12\\C++11_3.wmv","D:\\BaiduNetdiskDownload\\12\\C++11_003.wmv");
是成功的,而自己获取某个文件夹下面的所有文件,然后获取每个文件名,再逐一重命名,提示文件不存在或者命名失败
不知道是怎么回事,下面是代码
#include <iostream>
#include <fstream>
#include <io.h>
#include<vector>
#include <string.h>
using namespace std;
void getAllFiles(string path, vector<string>& files);
void Rename(char*filename,char*newname);
std::string subreplace(std::string resource_str, std::string sub_str, std::string new_str);
int main(void) {
string path = "D:\\BaiduNetdiskDownload\\12";
vector<string> files;
getAllFiles(path, files);
int size = files.size();
cout << size << endl;
for (int i = 0; i < 5; i++)
{
cout << files[i] << endl;
}
for (int i = 0; i < size; i++)
{
//int pos=files[i].find_last_of(".wmv");
int pos=files[i].find(".wmv");
cout << pos << endl;
//if(pos!=-string::npos)
if(pos!=string::npos)
{
int point=files[i].find_last_of("_");
cout <<files[i].size() <<" "<< point << endl;
if(files[i].size()-point==7)
{
//files[i].insert(point+1,"0");
std::ifstream f;
f.open(files[i].c_str());
if (f.fail())
{
std::cout << "File Open Failed!" << std::endl;
f.close();
}
else
{
f.close();
if (-1 == rename(files[i].c_str(), files[i].insert(point+1,"0").c_str()))
{
std::cout << "file rename failed!" << std::endl;
}
}
std::string oldName =subreplace(files[i],"/","\\") ;
int oldpoint=oldName.find_last_of("_");
std::string newName = oldName.insert(oldpoint+1,"0");
oldName =subreplace(files[i],"/","\\") ;
if (-1 == rename(oldName.c_str(), newName.c_str()))
{
Rename( const_cast<char *>(oldName.c_str()), const_cast<char *>(newName.c_str()));
cout <<"旧文件"<< oldName << endl;
printf("%s\n",oldName.c_str());
cout <<"新文件"<< newName << endl;
printf("%s\n",newName.c_str());
std::cout << "file rename failed!" << std::endl;
}
}
//out <<files[i].size()<<point<<" "<< files[i] << endl;
}
}
return 0;
}
void getAllFiles(string path, vector<string>& files)
{
//文件句柄
intptr_t hFile = 0;//参考资料中的long只能用于x86环境下,x64环境需要用_int64 或 intptr_t
// 文件信息
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)
{
//files.push_back(p.assign(path).append("\\").append(fileinfo.name));
getAllFiles(p.assign(path).append("/").append(fileinfo.name), files);
}
}
else
{
//每个路径后面加一个\n,作为vector容器的一个元素
files.push_back(p.assign(path).append("/").append(fileinfo.name).append("\n"));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
/**
重命名
*/
void Rename(char*filename,char*newname)
{
if(!_access(filename,0)){ //如果文件存在
if(!rename(filename,newname))//删除成功
{
cout<<filename<<"文件成功重命名为"<<newname<<endl ;
}
else//无法重命名:文件打不开或权限不够
{
cout<<"文件无法重命名(可能原因如下):"<<endl;
cout<<"\t"<<"1. "<<newname<<" 已存在"<<endl
<<"\t"<<"2. "<<newname<<" 正在使用,未关闭."<<endl
<<"\t"<<"3. "<<"你没有权限重命名此文件."<<endl;
}
}else{//文件不存在
cout<<"文件"<<filename<<"不存在该文件。"<<endl ;
}
//cin.get();
}
/*
函数说明:对字符串中所有指定的子串进行替换
参数:
string resource_str //源字符串
string sub_str //被替换子串
string new_str //替换子串
返回值: string
*/
std::string subreplace(std::string resource_str, std::string sub_str, std::string new_str)
{
std::string dst_str = resource_str;
std::string::size_type pos = 0;
while((pos = dst_str.find(sub_str)) != std::string::npos) //替换所有指定子串
{
dst_str.replace(pos, sub_str.length(), new_str);
}
return dst_str;
}