プレイリスト(m3u)を自動修正するプログラム

WMPでファイルを移動したときにプレイリスト(m3u)からファイルを見つけられないことがあるので
自動修正するプログラム書いてみた。
※ファイル名が変更されている場合は見つけられません。
いくつかハマった点としては、

  • fileをsjisで読み込んで文字化け(MS932で解決)
  • 再帰的探索からfilePathを返すのに苦労(解決するまでnullばかり)
  • ほぼ書き終わった後にnioを使う探索方法を知った
public class m3uFix {
    private static String filePath;

    public static void main(String[] args) {
        String m3uFileName="G:\\20140620 - コピー.m3u";
        try{
            File file = new File(m3uFileName);
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file),"MS932"));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file.getAbsolutePath()+"_fix.m3u"),"MS932"));
            String str;
            str=br.readLine();
            while(str != null){
                if(!str.startsWith("#") && str.length()>8){
                    str=str.replace("\\", "\\\\");
                    File mp3File = new File(str);
                    if(!mp3File.exists()){
                        System.out.print(str+"\n");
                        int index=str.lastIndexOf("\\");
                        String filename=str.substring(index+1);
                        filePath=null;
                        String fixedPath=listFiles("E:\\MP3\\",filename);
                        //System.out.println(fixedPath);
                        if(fixedPath!=null){
                            bw.write(fixedPath+"\n");
                            System.out.println(fixedPath);
                        }else{
                            //探索して発見できなかった場合そのまま
                            str=str.replace("\\\\", "\\");
                            bw.write(str+"\n");
                        }

                    }else{
                        //mp3ファイルが存在するのでそのまま書込む
                        str=str.replace("\\\\", "\\");
                        bw.write(str+"\n");
                    }
                }else{
                    bw.write(str+"\n");
                }
                str = br.readLine();
            }
            br.close();
            bw.close();
        }catch(FileNotFoundException e){
          System.out.println(e);
        }catch(IOException e){
          System.out.println(e);
        }
    }

    public static String listFiles(String directoryPath,String filename){
        File dir=new File(directoryPath);
        File[] files=dir.listFiles();
        for(int i=0;i<files.length;i++){
            File file=files[i];
            if(file.isDirectory()){
                listFiles(file.getAbsolutePath(), filename);
            }
            if(filePath!=null){
                break;
            }else{
                filePath=check(filename, file);
            }
        }
        return filePath;
    }

    private static String check(String filename,File file){

        if(!filename.equals(file.getName())){
            return null;
        }
        System.out.println("発見");
        return file.getAbsolutePath();
    }

}

参考:Java ディレクトリから再帰的にファイルを検索
お使いいただく場合は
String m3uFileName=”G:\20140620 – コピー.m3u”;
String fixedPath=listFiles(“E:\MP3\”,filename);
以上2行を自分の環境に合わせて変更してください。