风中飘荡的沙 发表于 2022-5-8 15:06

java重命名文件时随机失败

本帖最后由 风中飘荡的沙 于 2022-5-8 21:40 编辑

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


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

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
失败的歌名有些奇怪字符?

我贴一下所有失败的歌名,有一些是没有特殊字符的。这里的文件是每次运行都在的,原文件也没有被重命名
https://s1.328888.xyz/2022/05/08/4CND1.png

风中飘荡的沙 发表于 2022-5-8 21:30

Goldrepo 发表于 2022-5-8 19:54
我拿了那些失败的文件名debug后发现这个方法tag.getFirst(FieldKey.ARTIST)得到的艺人名存在/这种特殊符号 ...

多谢帮助,确实是这个问题,我自己去改一下吧
页: [1]
查看完整版本: java重命名文件时随机失败