Почему не переименовывается файл?

195
22 июня 2022, 14:40

Есть такая функция:

// корректировать имена файлов
private void correctFileName(){
    String fileName = file.getAbsolutePath();
    String name = file.getName();
    String newFileName = fileName.substring(0);
    // проверка на наличие пробелов между исполнителем и названием
    if(fileName.contains("-") && !fileName.contains(" - ")){
        newFileName = fileName.substring(0, fileName.indexOf("-"));
        newFileName += " - ";
        newFileName += fileName.substring(fileName.indexOf("-")+1);
    }
    // проверка на -kissvk.com
    if(newFileName.contains("-kissvk")){
        int endIndex = newFileName.length() - 15;
        newFileName = newFileName.substring(0, endIndex);
        newFileName += ".mp3";
    }
    System.out.println(newFileName);   
    File result = new File(newFileName);
    System.out.println(file.renameTo(result));
    file = result;
}

Она работает, файл переименовывается. Теперь есть такая функция:

// корректировать имена файлов
private void correctFileName(){
    String fileName = file.getAbsolutePath();
    String name = file.getName();
    String newFileName;
    
    // Если песня из альбома
    if(isAlbum){
        newFileName = fileName.substring(0, fileName.length()-name.length());
        newFileName += number;
        newFileName += ". ";
        newFileName += artist;
        newFileName += " - ";
        newFileName += songName;
        newFileName += ".mp3";
    }
    else{
        newFileName = fileName.substring(0, fileName.length()-name.length());
        newFileName += artist;
        newFileName += " - ";
        newFileName += songName;
        newFileName += ".mp3";           
    }
    
    System.out.println(newFileName);   
    File result = new File(newFileName);
    System.out.println(file.renameTo(result));
    file = result;
}

Это методы класса, isAlbum, file - его поля. Второй метод не работает, фактического переименования нет, результат renameTo() - false. Что не так с ней? Почему первая работает, а вторая нет? System.out.println(newFileName) выдает одинаковый результат.

Answer 1

Это специфика самого renameTo

Renames the file denoted by this abstract pathname. Many aspects of the behavior of this method are inherently platform-dependent: The rename operation might not be able to move a file from one filesystem to another, it might not be atomic, and it might not succeed if a file with the destination abstract pathname already exists. The return value should always be checked to make sure that the rename operation was successful.

Вам нужно проверять результат операции. И на существование уже этого файла в указанном пути, не говоря о платформе и прочие.

Существует альтернатива переименованию файла это перемещение.

пример взят из ответа.

String fileName = "MyFile.txt";
try {
    Files.move(new File(fileName).toPath(), new File(fileName).toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
} catch (IOException ex) {
    Logger.getLogger(SomeClass.class.getName()).log(Level.SEVERE, null, ex);
}
Answer 2

Я нашел корень зла. Я брал artist, songName из ID3v1, они в ANSI-кодировке. Функция не брала эти слова. Потом поменял на char, тоже не переименовывала. Заработала, когда передавал слова в String

READ ALSO
кастомный скролл для ie 11

кастомный скролл для ie 11

подскажите либу чтобы можно было сделать кастомный скролл для ie11, вид скроллбара снизу

257
Размер body. Как это работает?

Размер body. Как это работает?

Я хочу сделать множественный фон (вода и рыба)Рыбе хочу задать определенное местоположение, например background-position: right center

158
PyQt5 Печать HTML документов

PyQt5 Печать HTML документов

Друзья, кажется, я обыскал весь интернет, но так и не нашёл, какие сейчас есть способы печати HTML документов в PyQt5 ?

263