Ciao a tutti, sto scrivendo un programmino che sposta un file .mp3 in una directory scelta.
Ho provato diverse funzioni che fanno ciò ma nessuna funziona.

Ecco il codice:
codice:
  public static void moveToRightDirectory(File song, String album) throws IOException {
    album = album.trim();
    String pathDirectory = selectedDir + "\\" + album + "\\";
    File dir = new File(pathDirectory);
    //se la cartella esiste già, sposto la canzone
    if(dir.exists()) { 
      moveSong(song, dir);
    }
    //se la cartella non esiste, la creo e sposto il file
    else if(!dir.exists()) { 
      boolean success = (new File(pathDirectory)).mkdirs();
      if(!success) {
        System.out.println("Problema nella creazione della cartella.");
      }
      else {
        moveSong(song, dir);
      }
    }
    //altrimenti errore
    else { 
      System.out.println("Errore.");
    }
  }
  
  /**
   * Sposta la canzone.
   */
  public static void moveSong(File song, File dir) {
    String songPath = song.getAbsolutePath();
    System.out.println(songPath);
    try {
      System.out.println("\n" + song.getAbsolutePath() + " è aperto: " + checkFileAlreadyOpen(song));
      File oldFile = new File(song.getAbsolutePath());
      String dirPath = dir.getAbsolutePath()+ "\\"+ oldFile.getName();
      System.out.println(dirPath);
      if(oldFile.renameTo(new File(dir.getAbsolutePath()+ "\\"+ oldFile.getName()))) {
        System.out.println("The file was moved successfully to the new folder.");
      } 
      else {
        System.out.println("The File was not moved.");
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * Ritorna true se file è aperto da un altro processo, false altrimenti.
   */
  public static boolean checkFileAlreadyOpen(File file) {
    boolean isFileUnlocked = false;
    try {
        org.apache.commons.io.FileUtils.touch(file);
        isFileUnlocked = true;
    } 
    catch(IOException e) {
        isFileUnlocked = false;
    }
    if(isFileUnlocked) {
        return false;
    } 
    else {
      return true;
    }
  }
Eseguendolo non sposta nessun file, stampa sempre "The File was not moved.".

Allora ho provato usando la libreria nio:
codice:
public static void moveToRightDirectory(File song, String album) throws IOException {
    album = album.trim();
    String pathDirectory = selectedDir + "\\" + album;
    File dir = new File(pathDirectory);
    System.out.println("dir.exists(): " + dir.exists());
    if(dir.exists()) { 
      Files.move(song.toPath(), dir.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }
    else { 
      boolean success = (new File(pathDirectory)).mkdirs();
      if(!success) {
        System.out.println("Error creating directory.");
      }
      else {
        Files.move(song.toPath(), dir.toPath(), StandardCopyOption.REPLACE_EXISTING);
      }
    }
}
Ma viene lanciata l'eccezione:
java.nio.file.FileSystemException: C:\Users\...\Adele\Cold shoulder.mp3 -> C:\Users\...\Adele\19: The process cannot access the file because it is being used by another process.

Non ho aperto nessun music player quindi in quale processo è aperto il file?

Quindi ho provato ad usare la libreria di Apache:
codice:
public static void moveToRightDirectory(File song, String album) throws IOException {
    album = album.trim();
    String pathDirectory = selectedDir + "\\" + album;
    File dir = new File(pathDirectory);
    System.out.println("dir.exists(): " + dir.exists());
    if(dir.exists()) { 
      FileUtils.moveFile(song, dir);
    }
    else { 
      boolean success = (new File(pathDirectory)).mkdirs();
      if(!success) {
        System.out.println("Error creating directory.");
      }
      else {
        FileUtils.moveFile(song, dir);
      }
    }
}
Ma anche così non funziona.

Non so più cosa fare.. Come posso risolvere?
Ho cercato su Internet ma non ne sono venuto ancora a capo..

Grazie a chiunque voglia aiutarmi