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:55 编辑
我拿了那些失败的文件名debug后发现这个方法tag.getFirst(FieldKey.ARTIST)得到的艺人名存在/这种特殊符号(哪怕源文件里面艺人名没有/这个特殊符号在调用该方法后也会出现/),在windows里文件命名中不允许特殊符号存在,你可以拿到艺人名的时候判断一下是否存在特殊符号【歌曲名也一样最好判断一下】,如果存在的话要怎么处理,是要更改为空格还是其他符号,就可以了 失败的歌名有些奇怪字符? 你把报错信息贴出来不就行了 fc1314 发表于 2022-5-8 17:11
你把报错信息贴出来不就行了
就是因为没有任何报错信息,我才不理解 老婆是加藤惠 发表于 2022-5-8 16:44
失败的歌名有些奇怪字符?
我贴一下所有失败的歌名,有一些是没有特殊字符的。这里的文件是每次运行都在的,原文件也没有被重命名
https://s1.328888.xyz/2022/05/08/4CND1.png Goldrepo 发表于 2022-5-8 19:54
我拿了那些失败的文件名debug后发现这个方法tag.getFirst(FieldKey.ARTIST)得到的艺人名存在/这种特殊符号 ...
多谢帮助,确实是这个问题,我自己去改一下吧
页:
[1]