Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Spostare un file in una determinata cartella

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Che gran pasticcio
    codice:
    public static void moveFile(String filePath, String dirPath) throws Exception {
        File file = new File(filePath);
        if(!file.renameTo(new File(dirPath + "\\" + file.getName())))
            throw new Exception("Cannot move file " + file.getAbsolutePath());
    }
    Da usare
    codice:
    try{
        moveFile("C:\\Dir\\Dir\\file.ext","C:\\Dir\\NewDir");
    }catch(Exception e){
        //...
    }
    Ultima modifica di RoTeam; 12-07-2015 a 00:13

  3. #3
    Ciao RoTeam, grazie per la risposta. Ho provato ma non funziona, entra sempre nel catch..

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Quote Originariamente inviata da stefano86 Visualizza il messaggio
    Ciao RoTeam, grazie per la risposta. Ho provato ma non funziona, entra sempre nel catch..
    Ciao mi posti i percorsi che passi? Sei sicuro di non avere il file già aperto?

  5. #5
    codice:
      public static void moveFile(String filePath, String dirPath) throws Exception {
        File file = new File(filePath);
        if(!file.renameTo(new File(dirPath + "\\" + file.getName()))) {
          throw new Exception("Cannot move file " + file.getAbsolutePath());
        }
      }
    
      public static void move(File song, File dir) {
        try {
          moveFile(song.getAbsolutePath(), dir.getAbsolutePath());
        }
        catch(Exception e) {
          System.out.println("\nEccezione nel spostare il file " + song.getAbsolutePath());
          e.printStackTrace();
        }
      }
    Stampando le due stringhe, queste sono corrette.
    Il processo aperto potrebbe essere il listener associato al bottone della GUI che fa tutto ciò?

    Si sono sicuro di non avere già il file aperto..

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Nota a margine:
    Per avere portabilità, NON usare direttamente i backslash (con la questione dei quote, ecc), ma una di queste due:

    1) Usa sempre e solo i percorsi "alla Unix", ovvero con lo slash: si arrangia la JVM a convertire gli slash in backslash se la macchina è Windows

    2) Recupera il separatore di directory dall'apposita property e usalo:

    codice:
    File nf = new File(dirPath + File.separator + file.getName());

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Grazie LeleFT per il consiglio. Per il problema principale sai aiutarmi?

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ti stai complicando inutilmente la vita.
    Hai due oggetti File: il primo è il file da spostare, il secondo la directory dove spostarlo:

    codice:
    public static void move(File song, File dir) {
       File dst = new File(dir, song.getName());
       if ( !song.renameTo( dst ) ) {
          // ... errore: per qualche motivo il file non è spostabile
       }
    }

    Non servono né try/catch (le eventuali eccezioni sollevate sono di tipo unchecked), ne concatenazioni di alcun tipo.

    Se il metodo viene chiamato correttamente (con il primo oggetto File che punta ad un file fisico ed il secondo che punta ad una directory) la cosa funziona senza problemi.


    Ciao.
    Ultima modifica di LeleFT; 17-07-2015 a 12:23
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Grazie per l'aiuto. Ho provato come dici ma entra sempre nel caso di errore.. Non capisco veramente più niente, mi sembra una cosa banale ma ogni cosa che provo non funziona...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.