列出指定目录所有文件并修改文件名的源代码

shell命令可以很好实现“列出列出指定目录所有文件”的功能。特别需要注意的是,fgets获取每行内容外,还获取了换行符 \r\n(0D0A)。


/*
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /ad  c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、
文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,
因为当遇到非法文件夹名或非法文件名或非法文件长度、
非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,
API会处理的不全面或陷入死循环,而shell命令不会。

/a [[:] Attributes] 
只显示那些指定属性的目录名和文件名
-d 显示只是文件(而非目录) 
/b 列出每个目录名或文件名,每行一个(包含文件扩展名)。/b 不显示标题信息或摘要
*/
#include "stdafx.h"
#include <atlstr.h>
#include <iostream>
using namespace std;

//列出某给定目录的所有文件,并改文件名为1.txt,2.txt...
int main( void )
{
	char files[100][100] = {{'\0'}};
	int i = 0;
	CString filepath="E:\\hello";//1.sire和hello.txt,8字节
	CString shellStr;
	shellStr.Format("dir /B/A-D %s > filelist.txt",filepath);
	system(shellStr);
	//system("dir /B/A-D E:\\hello\\*.* > filelist.txt");//执行Windows指令将某一个目录下的所有的文件列出来并输出到一个文本文件中
	FILE* fp = fopen("filelist.txt", "rb");//打开文本文件,准备读取目录下的各个文件名(本身就不含有路径在内的
	while (!feof(fp) && i < 100)//如果文件没有到结尾而且数组未满
	{
		fgets(files[i], 100, fp);//读取一行(一行写入了目录中的一个文件),并换行;0D0A代表\r\n,files[i]包含了\r\n,所以比常量多出2个字节
		if(files[i][0]!='\0')
			cout << "files[" << i << "]=" << files[i];
		CString strTemp1;
		//strTemp1.Format("%s",filepath);//8
		//strTemp1.Format("%s",files[i]);//9/6
		strTemp1.Format("%s\\%s",filepath,files[i]);//为什么不行?20/17
		//strTemp1+="E:\\hello\\";//strTemp1为9字节
		//strTemp1+="hello.txt";//为什么行?18/15字节,常量
		//strTemp1+=files[i];//为什么不行?20/17字节,比常量正常情况多出2个字节(实际为2个空格),为什么?
		strTemp1.TrimRight();//尾部多出2个空格(奇怪?【多了0D0A】),2014.06.25添加:因为比常量多出2个空格导致修改(rename)失败
		cout << "strTemp1=" << strTemp1.GetLength() << " files[i]=" << strlen(files[i]);
		CString strTemp2;
		strTemp2.Format("%s\\%d.txt",filepath,i+1);
		if(files[i][0]!='\0')
			rename(strTemp1,strTemp2);
		//rename(strTemp1,strTemp2);//直接用strTemp1改名不行?
		//rename(temp1,temp2);
		int err_code = GetLastError();//出错信息是123:文件名、目录名或卷标语法不正确。 
		i++;
	}
	//rename("E:\\hello\\1.sire","E:\\hello\\1.txt");
	fclose(fp);
	fp = NULL;
	system("pause");
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值