C++文件重命名失败

uchiha_iTachi 2013-08-14 08:45:32
我是想把一个文件夹下所有文件按照一个格式命名,可为什么我这段代码不能正确的重命名文件?运行没什么错误,可就是没效果,就是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");
}
...全文
987 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
uchiha_iTachi 2013-08-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;
}
line_us 2013-08-15
  • 打赏
  • 举报
回复
原来是这样。
引用 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;
}
原来是这样。
uchiha_iTachi 2013-08-14
  • 打赏
  • 举报
回复
引用 13 楼 ken_scott 的回复:
[quote=引用 11 楼 liyuanhong13 的回复:] [quote=引用 8 楼 ken_scott 的回复:] [quote=引用 6 楼 liyuanhong13 的回复:] 我改成绝对路径也试过,还是没用
GetLastError()的返回值是什么?[/quote] 你这个好像也是vb,我那个不是vb啊[/quote] 你用的是C语言,平台是windows, GetLastError() 在 "windows.h"里面 也是C接口啊... if (c != 0) int err_code = GetLastError(); 然后,网上搜下这个错误码 (VS工具里的Lookup也可以)[/quote]运行结果err_code等于2
ken_scott 2013-08-14
  • 打赏
  • 举报
回复
引用 11 楼 liyuanhong13 的回复:
[quote=引用 8 楼 ken_scott 的回复:] [quote=引用 6 楼 liyuanhong13 的回复:] 我改成绝对路径也试过,还是没用
GetLastError()的返回值是什么?[/quote] 你这个好像也是vb,我那个不是vb啊[/quote] 你用的是C语言,平台是windows, GetLastError() 在 "windows.h"里面 也是C接口啊... if (c != 0) int err_code = GetLastError(); 然后,网上搜下这个错误码 (VS工具里的Lookup也可以)
uchiha_iTachi 2013-08-14
  • 打赏
  • 举报
回复
引用 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出的错
uchiha_iTachi 2013-08-14
  • 打赏
  • 举报
回复
引用 8 楼 ken_scott 的回复:
[quote=引用 6 楼 liyuanhong13 的回复:] 我改成绝对路径也试过,还是没用
GetLastError()的返回值是什么?[/quote] 你这个好像也是vb,我那个不是vb啊
uchiha_iTachi 2013-08-14
  • 打赏
  • 举报
回复
引用 5 楼 max_min_ 的回复:
这个 有错误码说明: http://msdn.microsoft.com/zh-cn/magazine/608h8bda(VS.90).aspx
你这个是vb的函数,不是这个函数,我用的是c语言的rename,返回值只有0和-1,0则成功,-1则失败
ken_scott 2013-08-14
  • 打赏
  • 举报
回复
上面我的代码可能也有问题。。 同个目录下怕会死循环
ken_scott 2013-08-14
  • 打赏
  • 举报
回复
引用 6 楼 liyuanhong13 的回复:
我改成绝对路径也试过,还是没用
GetLastError()的返回值是什么?
uchiha_iTachi 2013-08-14
  • 打赏
  • 举报
回复
引用 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";
就是一直失败
uchiha_iTachi 2013-08-14
  • 打赏
  • 举报
回复
引用 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";
我改成绝对路径也试过,还是没用
max_min_ 2013-08-14
  • 打赏
  • 举报
回复
引用 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
uchiha_iTachi 2013-08-14
  • 打赏
  • 举报
回复
引用 1 楼 mougaidong 的回复:
我用着这个不错,不知道楼主用的什么工具。 http://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/reference.html
我这个自己写的简单用用,你那里边看着太复杂了
ken_scott 2013-08-14
  • 打赏
  • 举报
回复
什么叫貌似失败? 如果失败, 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";
max_min_ 2013-08-14
  • 打赏
  • 举报
回复

//这里换成一个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");
这样试试先,看能不能解决,
turing-complete 2013-08-14
  • 打赏
  • 举报
回复
我用着这个不错,不知道楼主用的什么工具。 http://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/reference.html

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧