lst0426 2022-06-10 09:54 采纳率: 16.7%
浏览 90
已结题

c 语言rename函数

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

在使用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;
}

  • 写回答

4条回答 默认 最新

  • runningfatty 2022-06-10 15:43
    关注

    建议使用errno变量和strerror(errno)打印一下错误代码和错误原因,头文件errno.h
    我直接调动函数是没有问题的,猜测你那里可能是权限的问题?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月20日
  • 已采纳回答 6月12日
  • 创建了问题 6月10日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加