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");
}
...全文
888 17 打赏 收藏 转发到动态 举报
写回复
用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
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。

64,663

社区成员

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

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