Problema puntando ad un NAS con un java.io.File

di il
20 risposte

20 Risposte - Pagina 2

  • Re: Problema puntando ad un NAS con un java.io.File

    Dimenticavo: se vuoi elencare tutto il contenuto, non usare " *.* ", ma usa solo " * ", altrimenti non ti verranno elencate le directory (il pattern "*.*" matcha solo i file che hanno un'estensione).

    Quindi:

    for (FileIdBothDirectoryInformation f : share.list("Directory", "*")) {
        System.out.println("File : " + f.getFileName());
    }

    Questo codice presuppone che dentro alla share esista una directory chiamata "Directory" e ne elenca tutto il contenuto (sottodirectory + files).

  • Re: Problema puntando ad un NAS con un java.io.File

    22/09/2025 - SpiritoLibero ha scritto:

    Questi warning compaiono perchè, tra le librerie, non hai messo la libreria SLF4J, che è una libreria di logging che SMB4J può usare se la trova in classpath: va tutto bene, ti sta dicendo che non c'è una libreria di logging ed eventuali log informativi non verranno scritti da nessuna parte. Non è nulla di bloccante.

    Eh, ma io ho scaricato i file che mi hai indicato.
    Mi puoi dire il nome completo della libreria che servirebbe per il logging e da dove scaricarla? Perché non riesco a trovarla.

    22/09/2025 - SpiritoLibero ha scritto:

    Ovvero le due directory standard.

    Ok, per le directory standard, ma le altre perché non me le mostra?

    A questo punto però mi nasce un ulteriore domanda.
    Come faccio a fare la copia di alcuni files dal disco del pc al NAS se per accedere al disco del pc devo usare una libreria differente da quella per accedere al NAS?

    In pratica che istruzione o struttura di istruzioni dovrei utilizzare?

    Hai per caso un esempio da mostrarmi?

  • Re: Problema puntando ad un NAS con un java.io.File

    22/09/2025 - SpiritoLibero ha scritto:

    Dimenticavo: se vuoi elencare tutto il contenuto, non usare " *.* ", ma usa solo " * ", altrimenti non ti verranno elencate le directory (il pattern "*.*" matcha solo i file che hanno un'estensione).

    Quindi:

    for (FileIdBothDirectoryInformation f : share.list("Directory", "*")) {
        System.out.println("File : " + f.getFileName());
    }

    Questo codice presuppone che dentro alla share esista una directory chiamata "Directory" e ne elenca tutto il contenuto (sottodirectory + files).

    Ok, grazie, ho appena provato ma mi elenca solo le sottodirectory e i file contenuti nella "Directory" ma non nelle sottodirectory, ovvero si ferma solo al primo livello.
    Tra l'altro alla prima prova un file di testo me l'ha messo in una posizione casuale in mezzo alle directory, ora invece li elenca in ordine di data di ultima modifica.
    C'è qualcos'altro che mi sfugge? C'è forse da indicare qualche altro parametro?

  • Re: Problema puntando ad un NAS con un java.io.File

    22/09/2025 - ZioCrick ha scritto:

    Eh, ma io ho scaricato i file che mi hai indicato.
    Mi puoi dire il nome completo della libreria che servirebbe per il logging e da dove scaricarla? Perché non riesco a trovarla.

    Ma non te ne devi preoccupare: è una libreria (credo anche piuttosto corposa) che generalmente viene usata dai framework più grossi (io non la uso): se è presente può usufruirne, altrimenti non se ne fa nulla. Ripeto: puoi tranquillamente ignorare quei warning.

    22/09/2025 - ZioCrick ha scritto:

    Ok, grazie, ho appena provato ma mi elenca solo le sottodirectory e i file contenuti nella "Directory" ma non nelle sottodirectory, ovvero si ferma solo al primo livello.

    Ed è corretto. Esattamente come il metodo list o listFiles della classe java.io.File.

    Se vuoi andare in profondità dovrai chiedere di andare a leggere il contenuto della sotto-directory che ti interessa.

    Tra l'altro alla prima prova un file di testo me l'ha messo in una posizione casuale in mezzo alle directory, ora invece li elenca in ordine di data di ultima modifica.
    C'è qualcos'altro che mi sfugge? C'è forse da indicare qualche altro parametro?

    La documentazione non specifica in quale ordine vengano elencati i file, ma avendo un oggetto di tipo List lo puoi ordinare come ti pare usando un Comparator.

    Io, ad esempio, dopo aver ottenuto il listato, lo ordino in questo modo:

    Collections.sort(lista, ordinatore);

    Dove "lista" è l'oggetto List<FileIdBothDirectoryInformation> e "ordinatore" è un oggetto di una classe che implementa Comparator<FileIdBothDirectoryInformation> il quale mi ordina gli oggetti a mio gusto (ad esempio, questo comparatore ordina gli elementi per nome):

    public class OrdinatoreFiles implements Comparator<FileIdBothDirectoryInformation> {
        @Override
        public int compare(FileIdBothDirectoryInformation f1, FileIdBothDirectoryInformation f2) {
            return f1.getFileName().toLowerCase().compareTo( f2.getFileName().toLowerCase() );
        }
    }
  • Re: Problema puntando ad un NAS con un java.io.File

    22/09/2025 - SpiritoLibero ha scritto:

    Se vuoi andare in profondità dovrai chiedere di andare a leggere il contenuto della sotto-directory che ti interessa.

    Ok, infatti nel mio programma originale ho usato la ricorsione.

    Grazie per l'esempio sull'ordinamento della lista.

    Ora, tornando al mio problema iniziale: come faccio a fare la copia di files dal disco del pc al NAS se per accedere al disco del pc devo usare la libreria java.io.File mentre per accedere al NAS devo usare la smbj?

    In pratica che istruzione o struttura di istruzioni dovrei utilizzare?

    Hai per caso un esempio da mostrarmi?

  • Re: Problema puntando ad un NAS con un java.io.File

    Per copiare un file dal disco del PC al Nas dovrai seguire questi 4 passaggi:

    1) Ottenere un oggetto di tipo com.hierynomus.smbj.share.File che punti al file di destinazione sul Nas (come per l'oggetto java.io.File è semplicemente un segnaposto)
    2) Dall'oggetto com.hierynomus.smbj.share.File ottieni l'OutputStream dove andrai a scrivere il contenuto del file
    3) Apri il file sorgente in lettura, ottenendo un InputStream, leggi dall'InputStream e scrivi nell'OutputStream
    4) Chiudi tutti gli stream.

    Un esempio pratico:
    Supponiamo che tu voglia copiare il file "/home/utente/miofile.pdf" all'interno della directory "Backup" che si trova nella radice della share del Nas (quindi, per capirci, finirà in smb://<tuo-ip-nas>/NomeShare/Backup).

    java.io.File fileSRC = new java.io.File("/home/utente/miofile.pdf");
    com.hierynomus.smbj.share.File fileDST = 
       share.openFile("Backup/miofile.pdf",                              // Path
                      EnumSet.of(AccessMask.GENERIC_WRITE),              // Access Mask
                      null,                                              // Attributes
                      SMB2ShareAccess.ALL,                               // Share access
                      SMB2CreateDisposition.FILE_CREATE,                 // Create disposition
                      EnumSet.of(SMB2CreateOptions.FILE_RANDOM_ACCESS)   // Create Options
       );
    
    OutputStream os = null;
    FileInputStream fis = null;
    try {
       fis = new FileInputStream( fileSRC );
       os = fileDST.getOutputStream();
    
       int byteReads = 0;
       byte[] buffer = new byte[4096];
       while((byteReads = fis.read(buffer)) >= 0) {
          os.write(buffer, 0, byteReads);
       }
       os.flush();
    } catch (Exception e) {
       e.printStackTrace();
    } finally {
       if (fis != null) {
          try { fis.close(); } catch (Exception e) { }
       }
       if (os != null) {
          try { os.close(); } catch (Exception e) { }
       }
    }

    Se preferisci, puoi usare un try-with-resources, ovviamente, al posto di gestire manualmente la chiusura nel finally.

Devi accedere o registrarti per scrivere nel forum
20 risposte