小弟跪求批量更改文件名的求救

老农民77 2008-05-08 10:36:50
有个配置文件,例如test.ini,里面有如下信息:
*****test.ini****
2006510101023.dat,2006510101023.doc
200651010206.dat,200651010206.doc
2006510102112.dat,2006510102112.doc
2006510102151.dat,2006510102151.doc
200651011822.dat,200651011822.doc
.......
*****end**********
该文件假设在file目录下,且file目录下有很多文件名为*.dat的文件,现在要求能够实现调用test.ini文件进行查找比对
发现有文件名相同的,就将文件更名为“,”右边的文件名,例如查找到“2006510101023.dat”更名为“2006510101023.doc”,
依次查找比对,直到test.ini文件查找完毕为止,请前辈给出完整的C写法,在下不甚感激,谢谢!
...全文
118 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakaying 2008-05-08
  • 打赏
  • 举报
回复
没事写的,由于没有INI文件,楼主自己把读文件过程添上吧

#include <stdio.h>
#include <tchar.h>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
#include <windows.h>

vector<string> g_vstrFilename; // 原始文件名
vector<string> g_vstrNewName; // 新文件名

// 读取INI文件,注意文件名的对应关系
int ReadIniFile()
{
int count = 0;
g_vstrFilename.push_back("1.dat");
g_vstrNewName.push_back("1.doc");
count++;
g_vstrFilename.push_back("2.dat");
g_vstrNewName.push_back("2.doc");
count++;
g_vstrFilename.push_back("3.dat");
g_vstrNewName.push_back("3.doc");
count++;
g_vstrFilename.push_back("4.dat");
g_vstrNewName.push_back("4.doc");
count++;
return count;
}

BOOL GetNewName(string strOldName, string& strNewName)
{
//ASSET(!g_vstrFilename.empty());
//ASSET(g_vstrFilename.empty() == g_vstrNewName.size());
vector<string>::const_iterator itr = find(g_vstrFilename.begin(), g_vstrFilename.end(), strOldName);
if(itr == g_vstrFilename.end())
{
strNewName = "";
return FALSE;
}
strNewName = g_vstrNewName[itr - g_vstrFilename.begin()];
return TRUE;
}

// 查找并更新文件名,没有对文件夹进行操作,若需要可简单递归实现
BOOL RenameFile(string strDir)
{
string strFileFilter;
HANDLE hFind = NULL;
WIN32_FIND_DATA fileinfo;

strDir += "\\";
strFileFilter = strDir + "*.dat";

string strNewName;
hFind = FindFirstFile( strFileFilter.c_str(), &fileinfo );
do {
// 暂时不对文件夹进行操作
if(!(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
if(GetNewName(fileinfo.cFileName, strNewName))
{
rename((strDir + fileinfo.cFileName).c_str(), (strDir + strNewName).c_str());
}
}
} while( FindNextFile( hFind, &fileinfo ) );

FindClose(hFind);
return TRUE;
}

int main()
{
ReadIniFile();
RenameFile("D:\\temp");
return 0;
}
mirsoft 2008-05-08
  • 打赏
  • 举报
回复
http://www.jw35.cn/xc.asp?pic=mirsoft
老农民77 2008-05-08
  • 打赏
  • 举报
回复
哎,怎么没有高手帮我写一个呢?
老农民77 2008-05-08
  • 打赏
  • 举报
回复
有哪位兄弟帮帮我吧?实在急的很,谢谢,谢谢!!!
老农民77 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 c_spark 的回复:]
先将file目录下的所有的文件读入到一个数组中,将test.ini的文件信息读入到一个包括2个string的结构体中或是map <string,string>中,然后挨个文件名进行扫描,如果在test.ini中的每行的第一个字符串,将其名更改
实现简单,效率要低点...
[/Quote]
谢谢前辈,能否帮小弟写出语法,效率低点没关系,关键是现在急需解决问题,感谢了!
c_spark 2008-05-08
  • 打赏
  • 举报
回复
先将file目录下的所有的文件读入到一个数组中,将test.ini的文件信息读入到一个包括2个string的结构体中或是map<string,string>中,然后挨个文件名进行扫描,如果在test.ini中的每行的第一个字符串,将其名更改
实现简单,效率要低点...
老农民77 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kakaying 的回复:]
好像没有什么复杂的吧
遍历目录,逐个比对文件名,再Rename,都有现成的API
[/Quote]
老兄,我刚接触C,还很菜,现在我需要用这个方法解决实际问题,请帮我写出语法,可以吗?实在感谢了!
kakaying 2008-05-08
  • 打赏
  • 举报
回复
好像没有什么复杂的吧
遍历目录,逐个比对文件名,再Rename,都有现成的API
老农民77 2008-05-08
  • 打赏
  • 举报
回复
请大家帮帮忙吧!!!!!
老农民77 2008-05-08
  • 打赏
  • 举报
回复
kakaying兄不妨把您刚才的写法写完整贴上,呵呵!
兄弟一起参考了,谢谢!
kakaying 2008-05-08
  • 打赏
  • 举报
回复
吃个饭回来就搞定了啊
c_spark的方法比我的简单,利用system命令可以省掉很多麻烦
我刚调试了一下,使用纯API必须得去掉行尾的空格,呵呵
QQ我在个人信息里留下
老农民77 2008-05-08
  • 打赏
  • 举报
回复
非常感谢kakaying兄和c_spark兄的帮助,我采用c_spark兄的方法终于解决问题了,谢谢!!!
请kakaying兄和c_spark兄加我的QQ:46715422,或者告诉我你们的QQ,好吗?谢谢!
c_spark 2008-05-08
  • 打赏
  • 举报
回复
既然是以INI文件中的名字进行重命名,那么可以简单点
每次读入一行,分解出需要重命名的文件名用字符数组oldName,newName存放
如果文件名oldName存在,就对其重命名为newName
不存在那就跳过...
用函数access,头文件是io.h,
原型: int access(const char *filename, int mode);
mode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-1。
lz试试看能用没...
程序如下:
#include <stdio.h> 
#include <io.h>
#include <stdlib.h>

//判断文件是否存在,如果存在则重命名
int isExist(char *filename)
{
return (access(filename, 0) == 0);
}

int main(void)
{
int i,j;
char line[100];
//读ini文件
FILE *fp = fopen("c:\\test.ini","r");
if(fp == NULL)
{
printf("file open failed!\n");
return 0;
}
char oldName[100],newName[100];
while(fgets(line, 100, fp))
{
//取出oldName,newName以逗号分开
i = 0;
j = 0;
while(line[i] != ',')
{
oldName[j] = line[i];
++i;
++j;
}
++i;
oldName[j] = '\0';
j = 0;
while(line[i] != '\0')
{
newName[j] = line[i];
++i;
++j;
}
newName[j] = '\0';
char cmd[100];
if(isExist(oldName))//当前文件夹下存在该文件名
{
//重命名
sprintf(cmd,"ren %s %s",oldName,newName);
printf("cmd: %s\n",cmd);
if(system(cmd) != 0)
{
printf("rename failed!\n");
}
}
}
return 0;
}
老农民77 2008-05-08
  • 打赏
  • 举报
回复
感谢kakaying,但是惭愧,小弟刚刚接触这些,由于急于解决问题,所以,请kakaying兄帮写出完整的代码,包含读取ini的,但是有一点说明下,INI中的信息并不是纯粹的把dat文件转成doc,应该是与“,”前的比对,正确的,就更新为“,”之后的文件名,谢谢了,INI信息举例如下:
2006510101023.dat,2006510101023.doc
200651010206.dat,200651010206.doc
2006510102112.dat,2006510102112.doc
2006510102151.dat,2006510102151.doc
200651011822.dat,200651011822.xls
200651011823.dat,200651011823.doc
2006510118255.dat,2006510118255.ppt
........

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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