某日在B站上下载了一个音乐合集,有100多首歌曲,但是文件名既有歌手,又有一些代码,显得很是杂乱。我只想要歌曲的名字,其他东西不想要,于是想要借助C语言程序来批量修改文件名。文件名格式如下。
思路:可见文件名的规律是:在'-'和'('之间的部分就是文件名,因此只需要提取这两个字符之间的文字作为新的文件名即可。由于已经毕业多年,C语言早已经忘得八九不离十,所以从网上东拼西凑了几个程序终于实现了功能,因此实现过程略显繁琐,还请见谅批评。
程序简介:
1.建立一个存放音乐的文件夹。
2.提取所有文件的文件名到一个txt文件中。
3.逐行读取这个文件,将提取之后的文件名替换原先的文件名,借助于rename函数。
#include <stdio.h>
#include <string.h>
#include <io.h>
int main()
{
/*首先生成所有歌曲文件的目录并保存在result.txt文档中*/
char catalog[150] = "C:\\Users\\Xyan1\\Desktop\\music"; //文件目录,根据需要换成自己的
char type[20] = "mp3" ; //文件类型
FILE *fp;
long handle; //句柄
struct _finddata_t fileinfo; //文件信息结构体
char save[150]; //保存文件地址
strcpy(save, catalog);
strcat(save, "\\\\result.txt");
char search[150]; //欲查找的文件,支持通配符
strcpy(search, catalog);
strcat(search, "\\\\*.");
strcat(search, type); //
fp = fopen(save, "w+"); // 打开文件
if (fp==0)
{
printf("文件打开失败!\n");
return 0;
}
handle=_findfirst(search,&fileinfo); //第一次查找
if(-1==handle)
{
fclose(fp);
printf("未找到所需文件。\n");
return -1;
}
fprintf(fp,"%s\n",fileinfo.name); //打印出找到的文件的文件名
while(!_findnext(handle,&fileinfo)) //循环查找其他符合的文件,直到找不到其他的为止
{
fprintf(fp,"%s\n",fileinfo.name);
}
_findclose(handle); //关闭句柄
printf("查找成功。\n");
fclose(fp);
/*对于上面生成的文件目录进行逐项修改该,观察到文件名的特点是:'-'和'('之间的部分为文件名
所以只需要提取这两个字符之间的文字作为新的文件名即可,这部分代码可以根据实际的文件名进行修改*/
FILE *file;
int j,i,k;
char buffer[100];
char oldname[100], newname[100];
file = fopen("C:\\Users\\Xyan1\\Desktop\\music\\result.txt", "r");
if (file == NULL)
{
printf("Failed to open file.\n");
return 1;
}
char *Name;
while (fgets(buffer, 1000, file) != NULL) //逐行读取文件名 直到结束为止
{
for(i = 0; i <= 99; i ++) //先对字符初始化
{
newname[i] = '\0';
}
for(i = 0; i <= 99; i ++) //先对字符初始化
{
oldname[i] = '\0';
}
Name = buffer;
int Name_Length = strlen(Name);
Name_Length = Name_Length - 6;
for(i = 0; i <= Name_Length; i ++)
{
oldname[i] = Name[i];
}
oldname[i] = '\n';
int start = 0,stop = 0; //定义两个标记点,代表起始位置和结束位置
/*观察文件名的规律,'-'和'('中间的就是文件名*/
for(i = 0; i <= Name_Length; i ++)
{
if(oldname[i] == '-')
{
start = i;
break;
}
}
for(i = 0; i <= Name_Length; i ++)
{
if(oldname[i] == '(')
{
stop = i;
break;
}
}
k = 0;
start ++;
for(i = start; i < stop; i ++)
{
newname[k] = oldname[i];
k ++;
}
char Oldname[100];//带路径的文件名
char Location[200] = "C:\\Users\\Xyan1\\Desktop\\music\\";
char MoreName[10] = ".mp3";
strcat(newname,MoreName);
strcat(Location,Name);
for(i = 0; i <= strlen(Location); i ++)
{
Oldname[i] = Location[i];
}
Oldname[strlen(Oldname) - 1] = '\0';//旧的名字结尾是换行的话下面的rename函数会提示参数错误
puts(Oldname); //测试程序用,可以去掉
puts(newname); //测试程序用,可以去掉
if (rename(Oldname, newname) == 0)
{
printf("Renamed %s to %s.\n", Oldname, newname);
}
else
{
perror("rename");
}
}
fclose(file);
return 0;
}