批量修改文件名小程序(C语言)

        某日在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;
}


 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值