吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1008|回复: 6
收起左侧

[求助] java重命名文件时随机失败

  [复制链接]
风中飘荡的沙 发表于 2022-5-8 15:06
本帖最后由 风中飘荡的沙 于 2022-5-8 21:40 编辑

问题已解决,下面提供一下修改完毕的代码,代码写的比较冗杂,有需要的朋友可自取。
传输链接:https://cowtransfer.com/s/6bfd8e7d8a9a43 或 打开【奶牛快传】cowtransfer.com 使用传输口令:lpvea6 提取;
————————分割线————————


这个是我自己写的一个小程序,用于将”艺人-歌曲名“的格式重命名为”歌曲名-艺人“,使用过程中发现有一些文件无法修改文件名且程序不报错,不知道是什么原因,求大神解答,多谢!下面是代码,后附源文件及可执行jar

[Java] 纯文本查看 复制代码
import org.apache.commons.io.FilenameUtils;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.AudioHeader;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.audio.flac.FlacFileReader;
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;
import org.jaudiotagger.audio.mp3.MP3FileReader;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.Tag;
import org.jaudiotagger.tag.TagException;
import org.jaudiotagger.tag.id3.AbstractID3v2Frame;
import org.jaudiotagger.tag.id3.AbstractID3v2Tag;
import org.jaudiotagger.tag.id3.framebody.FrameBodyAPIC;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;


public class test {
    public static void main(String[] args) throws CannotReadException, TagException, InvalidAudioFrameException, ReadOnlyFileException, IOException {
        //关闭jAudioTagger的控制台输出
        Logger[] pin = new Logger[]{Logger.getLogger("org.jaudiotagger")};

        for (Logger l : pin)
            l.setLevel(Level.OFF);
        int count = 0;
        List<File> fileList = new ArrayList<File>();
        String path = System.getProperty("user.dir");
        File file = new File(path);
        File[] files = file.listFiles();
        for (File f:files) {
            String fileName = f.getName();
            String suffix = FilenameUtils.getExtension(fileName);
            if(suffix.equals("mp3")){
                MP3FileReader mp3Reader = new MP3FileReader();
                AudioFile mp3 = mp3Reader.read(f);
                Tag tag = mp3.getTag();
                String musicName = tag.getFirst(FieldKey.TITLE);
                if(!isMatch(musicName, fileName)){
                    String name = f.getParent() + "\\" + musicName + " - " + tag.getFirst(FieldKey.ARTIST) + ".mp3";
                    f.renameTo(new File(name));
                    System.out.println("文件 "+musicName + " - " + tag.getFirst(FieldKey.ARTIST)+" 已重命名完成");
                    count++;
                }
            }else if(suffix.equals("flac")){
                FlacFileReader reader = new FlacFileReader();
                AudioFile flac = reader.read(f);
                Tag tag = flac.getTag();
                String musicName = tag.getFirst(FieldKey.TITLE);
                if(!isMatch(musicName, fileName)){
                    String name = f.getParent() + "\\" + musicName + " - " + tag.getFirst(FieldKey.ARTIST) + ".flac";
                    f.renameTo(new File(name));
                    System.out.println("文件 "+musicName + " - " + tag.getFirst(FieldKey.ARTIST)+" 已重命名完成");
                    count++;
                }
            }
        }
        System.out.println("共修改文件"+count+"个");
    }
    static boolean isMatch(String pattern, String res){
        int p = pattern.length();
        int r = res.length();
        for(int i = 0; i < p; i++){
            if(!(pattern.charAt(i) == res.charAt(i)))
                return false;
        }
        return true;
    }
}

源文件: https://cowtransfer.com/s/6d4551e1763047 或 打开【奶牛快传】cowtransfer.com 使用传输口令:dysuus 提取;
部分无法重命名文件: https://cowtransfer.com/s/2242a906e55141 或 打开【奶牛快传】cowtransfer.com 使用传输口令:mv4n65 提取;

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Goldrepo 发表于 2022-5-8 19:54
本帖最后由 Goldrepo 于 2022-5-8 19:55 编辑

我拿了那些失败的文件名debug后发现这个方法tag.getFirst(FieldKey.ARTIST)得到的艺人名存在/这种特殊符号(哪怕源文件里面艺人名没有/这个特殊符号在调用该方法后也会出现/),在windows里文件命名中不允许特殊符号存在,你可以拿到艺人名的时候判断一下是否存在特殊符号【歌曲名也一样最好判断一下】,如果存在的话要怎么处理,是要更改为空格还是其他符号,就可以了
老婆是加藤惠 发表于 2022-5-8 16:44
fc1314 发表于 2022-5-8 17:11
 楼主| 风中飘荡的沙 发表于 2022-5-8 18:04
fc1314 发表于 2022-5-8 17:11
你把报错信息贴出来不就行了

就是因为没有任何报错信息,我才不理解
 楼主| 风中飘荡的沙 发表于 2022-5-8 18:13
老婆是加藤惠 发表于 2022-5-8 16:44
失败的歌名有些奇怪字符?

我贴一下所有失败的歌名,有一些是没有特殊字符的。这里的文件是每次运行都在的,原文件也没有被重命名
 楼主| 风中飘荡的沙 发表于 2022-5-8 21:30
Goldrepo 发表于 2022-5-8 19:54
我拿了那些失败的文件名debug后发现这个方法tag.getFirst(FieldKey.ARTIST)得到的艺人名存在/这种特殊符号 ...

多谢帮助,确实是这个问题,我自己去改一下吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表