C++文件重命名失败

时间:2022-08-05 10:39:04
我是想把一个文件夹下所有文件按照一个格式命名,可为什么我这段代码不能正确的重命名文件?运行没什么错误,可就是没效果,就是rename没正确运行,或者说我没写对,有人能帮我解答一下吗?今天晚上就得搞定,大家帮帮忙啊……
#include<iostream>
#include<io.h>
using namespace std;


void main()
{
string newname = "image_disciple_";
//ar newname[30] = "image_disciple_";
int num = 1099;
//string lujing = "C:\\Users\\carol\\Documents\\Tencent Files\\189654842\\FileRecv\\test\\";
    
_finddata_t file;
    long lf;
    if((lf = _findfirst("C:\\Users\\carol\\Documents\\Tencent Files\\189654842\\FileRecv\\调整尺寸PNG\\*.*", &file))==-1l)//_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *)
        cout<<"文件没有找到!\n";
    else
    {
        cout<<"\n文件列表:\n";
        while( _findnext( lf, &file ) == 0 )//int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1
        {

char cnum[4] = "";
            cout<<file.name<< "  ";
            
++num;
itoa(num,cnum,10);
newname += cnum;
newname += ".png";
int c = rename(file.name,newname.c_str());//这里貌似一直失败,为什么啊?是函数用法不对吗?
if (c==0)
cout<<"succeed!";
cout<<newname.c_str();
newname = "image_disciple_";
            cout<<endl;

        }
    }
    _findclose(lf);
system("pause");
}

17 个解决方案

#1


我用着这个不错,不知道楼主用的什么工具。

http://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/reference.html

#2



//这里换成一个char NewfileName[]; 
//用strcpy函数拷贝试试
newname += cnum;             
newname += ".png";  
int c = rename(file.name,newname.c_str());           
//rename函数调用换下
int c = rename(file.name,NewfileName);
if (c != 0)
   printf("rename failed!\n");


这样试试先,看能不能解决,

#3


什么叫貌似失败? 如果失败, GetLastError(); 看看错误码

也许需要一个绝对路径。。。

std::string prefix("C:\\Users\\carol\\Documents\\Tencent Files\\189654842\\FileRecv\\调整尺寸PNG\\");

std::string oldname(prefix);
oldname += file.name;

std::string newname(prefix);
newname += "image_disciple_";
newname += cnum;
newname += ".png";

#4


引用 1 楼 mougaidong 的回复:
我用着这个不错,不知道楼主用的什么工具。

http://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/reference.html
我这个自己写的简单用用,你那里边看着太复杂了

#5


引用 2 楼 max_min_ 的回复:

//这里换成一个char NewfileName[]; 
//用strcpy函数拷贝试试
newname += cnum;             
newname += ".png";  
int c = rename(file.name,newname.c_str());           
//rename函数调用换下
int c = rename(file.name,NewfileName);
if (c != 0)
   printf("rename failed!\n");


这样试试先,看能不能解决,


上面补充一点 都需要绝对路径的


if (c != 0)
   printf("rename failed c =%d!\n", c);


看看错误返回多少
这个 有错误码说明:
http://msdn.microsoft.com/zh-cn/magazine/608h8bda(VS.90).aspx

#6


引用 3 楼 ken_scott 的回复:
什么叫貌似失败? 如果失败, GetLastError(); 看看错误码

也许需要一个绝对路径。。。

std::string prefix("C:\\Users\\carol\\Documents\\Tencent Files\\189654842\\FileRecv\\调整尺寸PNG\\");

std::string oldname(prefix);
oldname += file.name;

std::string newname(prefix);
newname += "image_disciple_";
newname += cnum;
newname += ".png";
我改成绝对路径也试过,还是没用

#7


引用 3 楼 ken_scott 的回复:
什么叫貌似失败? 如果失败, GetLastError(); 看看错误码

也许需要一个绝对路径。。。

std::string prefix("C:\\Users\\carol\\Documents\\Tencent Files\\189654842\\FileRecv\\调整尺寸PNG\\");

std::string oldname(prefix);
oldname += file.name;

std::string newname(prefix);
newname += "image_disciple_";
newname += cnum;
newname += ".png";
就是一直失败

#8


引用 6 楼 liyuanhong13 的回复:
我改成绝对路径也试过,还是没用

GetLastError()的返回值是什么?

#9


上面我的代码可能也有问题。。 同个目录下怕会死循环

#10


引用 5 楼 max_min_ 的回复:
这个 有错误码说明:
http://msdn.microsoft.com/zh-cn/magazine/608h8bda(VS.90).aspx

你这个是vb的函数,不是这个函数,我用的是c语言的rename,返回值只有0和-1,0则成功,-1则失败

#11


引用 8 楼 ken_scott 的回复:
Quote: 引用 6 楼 liyuanhong13 的回复:

我改成绝对路径也试过,还是没用

GetLastError()的返回值是什么?

你这个好像也是vb,我那个不是vb啊

#12


引用 2 楼 max_min_ 的回复:

//这里换成一个char NewfileName[]; 
//用strcpy函数拷贝试试
newname += cnum;             
newname += ".png";  
int c = rename(file.name,newname.c_str());           
//rename函数调用换下
int c = rename(file.name,NewfileName);
if (c != 0)
   printf("rename failed!\n");


这样试试先,看能不能解决,
字符串拼接没什么问题,就是rename出的错

#13


引用 11 楼 liyuanhong13 的回复:
Quote: 引用 8 楼 ken_scott 的回复:

Quote: 引用 6 楼 liyuanhong13 的回复:

我改成绝对路径也试过,还是没用

GetLastError()的返回值是什么?

你这个好像也是vb,我那个不是vb啊

你用的是C语言,平台是windows,
GetLastError() 在 "windows.h"里面
也是C接口啊... 

if (c != 0)
   int err_code = GetLastError();
然后,网上搜下这个错误码 (VS工具里的Lookup也可以)

#14


引用 13 楼 ken_scott 的回复:
Quote: 引用 11 楼 liyuanhong13 的回复:

Quote: 引用 8 楼 ken_scott 的回复:

Quote: 引用 6 楼 liyuanhong13 的回复:

我改成绝对路径也试过,还是没用

GetLastError()的返回值是什么?

你这个好像也是vb,我那个不是vb啊

你用的是C语言,平台是windows,
GetLastError() 在 "windows.h"里面
也是C接口啊... 

if (c != 0)
   int err_code = GetLastError();
然后,网上搜下这个错误码 (VS工具里的Lookup也可以)
运行结果err_code等于2

#15


终于搞定了!多谢大家的帮助,最后总结一下,貌似先获取文件夹下所有文件再一个个rename的话,就要加绝对路径,但是单个文件的话,跟cpp文件在同一目录下好像就可以,可我还是觉得这两种情况应该都可以不用绝对路径(虽然这么做运行结果不对)。代码贴出来,大家看看吧,有什么不足的地方希望大家多多指出,多提提意见!
#include<iostream>
#include<io.h>
#include<cstdlib>
#include<string>
using namespace std;

int  main()
{
string newname = "C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\image_disciple_";
int num = 1099;

_finddata_t file;
long lf;
if((lf = _findfirst("C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\*.*", &file))==-1l)//_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *)
cout<<"文件没有找到!\n";
else
{
_findnext( lf, &file );
cout<<"\n文件列表:\n";
while( _findnext( lf, &file ) == 0 )//int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1
{
//char newname[] = "image_disciple_";
char cnum[5] = "";
cout<<file.name<< "  ";

++num;
_itoa(num,cnum,10);

newname += cnum;
newname += ".png";

string oldname = file.name;
oldname = "C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\" + oldname;
int c = rename(oldname.c_str(),newname.c_str());
cout<<newname.c_str()<<"  ";

if ( c == 0 )
puts ( "File successfully renamed" );
else
perror( "Error renaming file" );

newname = "image_disciple_";
cout<<endl;

}
}
_findclose(lf);
system("pause");
return 0;
}

#16


该回复于2013-08-15 10:42:27被管理员删除

#17



原来是这样。

引用 15 楼 liyuanhong13 的回复:
终于搞定了!多谢大家的帮助,最后总结一下,貌似先获取文件夹下所有文件再一个个rename的话,就要加绝对路径,但是单个文件的话,跟cpp文件在同一目录下好像就可以,可我还是觉得这两种情况应该都可以不用绝对路径(虽然这么做运行结果不对)。代码贴出来,大家看看吧,有什么不足的地方希望大家多多指出,多提提意见!
#include<iostream>
#include<io.h>
#include<cstdlib>
#include<string>
using namespace std;

int  main()
{
string newname = "C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\image_disciple_";
int num = 1099;

_finddata_t file;
long lf;
if((lf = _findfirst("C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\*.*", &file))==-1l)//_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *)
cout<<"文件没有找到!\n";
else
{
_findnext( lf, &file );
cout<<"\n文件列表:\n";
while( _findnext( lf, &file ) == 0 )//int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1
{
//char newname[] = "image_disciple_";
char cnum[5] = "";
cout<<file.name<< "  ";

++num;
_itoa(num,cnum,10);

newname += cnum;
newname += ".png";

string oldname = file.name;
oldname = "C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\" + oldname;
int c = rename(oldname.c_str(),newname.c_str());
cout<<newname.c_str()<<"  ";

if ( c == 0 )
puts ( "File successfully renamed" );
else
perror( "Error renaming file" );

newname = "image_disciple_";
cout<<endl;

}
}
_findclose(lf);
system("pause");
return 0;
}

原来是这样。

#1


我用着这个不错,不知道楼主用的什么工具。

http://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/reference.html

#2



//这里换成一个char NewfileName[]; 
//用strcpy函数拷贝试试
newname += cnum;             
newname += ".png";  
int c = rename(file.name,newname.c_str());           
//rename函数调用换下
int c = rename(file.name,NewfileName);
if (c != 0)
   printf("rename failed!\n");


这样试试先,看能不能解决,

#3


什么叫貌似失败? 如果失败, GetLastError(); 看看错误码

也许需要一个绝对路径。。。

std::string prefix("C:\\Users\\carol\\Documents\\Tencent Files\\189654842\\FileRecv\\调整尺寸PNG\\");

std::string oldname(prefix);
oldname += file.name;

std::string newname(prefix);
newname += "image_disciple_";
newname += cnum;
newname += ".png";

#4


引用 1 楼 mougaidong 的回复:
我用着这个不错,不知道楼主用的什么工具。

http://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/reference.html
我这个自己写的简单用用,你那里边看着太复杂了

#5


引用 2 楼 max_min_ 的回复:

//这里换成一个char NewfileName[]; 
//用strcpy函数拷贝试试
newname += cnum;             
newname += ".png";  
int c = rename(file.name,newname.c_str());           
//rename函数调用换下
int c = rename(file.name,NewfileName);
if (c != 0)
   printf("rename failed!\n");


这样试试先,看能不能解决,


上面补充一点 都需要绝对路径的


if (c != 0)
   printf("rename failed c =%d!\n", c);


看看错误返回多少
这个 有错误码说明:
http://msdn.microsoft.com/zh-cn/magazine/608h8bda(VS.90).aspx

#6


引用 3 楼 ken_scott 的回复:
什么叫貌似失败? 如果失败, GetLastError(); 看看错误码

也许需要一个绝对路径。。。

std::string prefix("C:\\Users\\carol\\Documents\\Tencent Files\\189654842\\FileRecv\\调整尺寸PNG\\");

std::string oldname(prefix);
oldname += file.name;

std::string newname(prefix);
newname += "image_disciple_";
newname += cnum;
newname += ".png";
我改成绝对路径也试过,还是没用

#7


引用 3 楼 ken_scott 的回复:
什么叫貌似失败? 如果失败, GetLastError(); 看看错误码

也许需要一个绝对路径。。。

std::string prefix("C:\\Users\\carol\\Documents\\Tencent Files\\189654842\\FileRecv\\调整尺寸PNG\\");

std::string oldname(prefix);
oldname += file.name;

std::string newname(prefix);
newname += "image_disciple_";
newname += cnum;
newname += ".png";
就是一直失败

#8


引用 6 楼 liyuanhong13 的回复:
我改成绝对路径也试过,还是没用

GetLastError()的返回值是什么?

#9


上面我的代码可能也有问题。。 同个目录下怕会死循环

#10


引用 5 楼 max_min_ 的回复:
这个 有错误码说明:
http://msdn.microsoft.com/zh-cn/magazine/608h8bda(VS.90).aspx

你这个是vb的函数,不是这个函数,我用的是c语言的rename,返回值只有0和-1,0则成功,-1则失败

#11


引用 8 楼 ken_scott 的回复:
Quote: 引用 6 楼 liyuanhong13 的回复:

我改成绝对路径也试过,还是没用

GetLastError()的返回值是什么?

你这个好像也是vb,我那个不是vb啊

#12


引用 2 楼 max_min_ 的回复:

//这里换成一个char NewfileName[]; 
//用strcpy函数拷贝试试
newname += cnum;             
newname += ".png";  
int c = rename(file.name,newname.c_str());           
//rename函数调用换下
int c = rename(file.name,NewfileName);
if (c != 0)
   printf("rename failed!\n");


这样试试先,看能不能解决,
字符串拼接没什么问题,就是rename出的错

#13


引用 11 楼 liyuanhong13 的回复:
Quote: 引用 8 楼 ken_scott 的回复:

Quote: 引用 6 楼 liyuanhong13 的回复:

我改成绝对路径也试过,还是没用

GetLastError()的返回值是什么?

你这个好像也是vb,我那个不是vb啊

你用的是C语言,平台是windows,
GetLastError() 在 "windows.h"里面
也是C接口啊... 

if (c != 0)
   int err_code = GetLastError();
然后,网上搜下这个错误码 (VS工具里的Lookup也可以)

#14


引用 13 楼 ken_scott 的回复:
Quote: 引用 11 楼 liyuanhong13 的回复:

Quote: 引用 8 楼 ken_scott 的回复:

Quote: 引用 6 楼 liyuanhong13 的回复:

我改成绝对路径也试过,还是没用

GetLastError()的返回值是什么?

你这个好像也是vb,我那个不是vb啊

你用的是C语言,平台是windows,
GetLastError() 在 "windows.h"里面
也是C接口啊... 

if (c != 0)
   int err_code = GetLastError();
然后,网上搜下这个错误码 (VS工具里的Lookup也可以)
运行结果err_code等于2

#15


终于搞定了!多谢大家的帮助,最后总结一下,貌似先获取文件夹下所有文件再一个个rename的话,就要加绝对路径,但是单个文件的话,跟cpp文件在同一目录下好像就可以,可我还是觉得这两种情况应该都可以不用绝对路径(虽然这么做运行结果不对)。代码贴出来,大家看看吧,有什么不足的地方希望大家多多指出,多提提意见!
#include<iostream>
#include<io.h>
#include<cstdlib>
#include<string>
using namespace std;

int  main()
{
string newname = "C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\image_disciple_";
int num = 1099;

_finddata_t file;
long lf;
if((lf = _findfirst("C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\*.*", &file))==-1l)//_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *)
cout<<"文件没有找到!\n";
else
{
_findnext( lf, &file );
cout<<"\n文件列表:\n";
while( _findnext( lf, &file ) == 0 )//int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1
{
//char newname[] = "image_disciple_";
char cnum[5] = "";
cout<<file.name<< "  ";

++num;
_itoa(num,cnum,10);

newname += cnum;
newname += ".png";

string oldname = file.name;
oldname = "C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\" + oldname;
int c = rename(oldname.c_str(),newname.c_str());
cout<<newname.c_str()<<"  ";

if ( c == 0 )
puts ( "File successfully renamed" );
else
perror( "Error renaming file" );

newname = "image_disciple_";
cout<<endl;

}
}
_findclose(lf);
system("pause");
return 0;
}

#16


该回复于2013-08-15 10:42:27被管理员删除

#17



原来是这样。

引用 15 楼 liyuanhong13 的回复:
终于搞定了!多谢大家的帮助,最后总结一下,貌似先获取文件夹下所有文件再一个个rename的话,就要加绝对路径,但是单个文件的话,跟cpp文件在同一目录下好像就可以,可我还是觉得这两种情况应该都可以不用绝对路径(虽然这么做运行结果不对)。代码贴出来,大家看看吧,有什么不足的地方希望大家多多指出,多提提意见!
#include<iostream>
#include<io.h>
#include<cstdlib>
#include<string>
using namespace std;

int  main()
{
string newname = "C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\image_disciple_";
int num = 1099;

_finddata_t file;
long lf;
if((lf = _findfirst("C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\*.*", &file))==-1l)//_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *)
cout<<"文件没有找到!\n";
else
{
_findnext( lf, &file );
cout<<"\n文件列表:\n";
while( _findnext( lf, &file ) == 0 )//int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1
{
//char newname[] = "image_disciple_";
char cnum[5] = "";
cout<<file.name<< "  ";

++num;
_itoa(num,cnum,10);

newname += cnum;
newname += ".png";

string oldname = file.name;
oldname = "C:\\Users\\LYH\\Desktop\\rename\\rename\\test\\" + oldname;
int c = rename(oldname.c_str(),newname.c_str());
cout<<newname.c_str()<<"  ";

if ( c == 0 )
puts ( "File successfully renamed" );
else
perror( "Error renaming file" );

newname = "image_disciple_";
cout<<endl;

}
}
_findclose(lf);
system("pause");
return 0;
}

原来是这样。