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

di il
41 risposte

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

Buongiorno a tutti.

Sto facendo un programma Java in cui vengono copiati dei file dal disco fisso ad altri dischi USB o NAS.

Ho una stringa che contiene il percorso completo di un file, per esempio: 
String sFile = "/media/Dati/Cartella/File.txt";
se faccio: 
java.io.File fiName = new File(sFile);
la fiName.getPath() restituisce il percoso completo corretto.

Se invece la sFile contiene il percorso verso un NAS, esempio: "smb://nas1/public/Cartella/File.txt"
la fiName.getPath() restituisce "smb:/nas1/public/Cartella/File.txt"
ovvero mi toglie il secondo "/" dopo "smb:"

Questo fa si che le opertazioni con fiName, tipo una Files.copy non vanno a buon fine, perchè fiName non punta al NAS ma ad una cartella locale del disco in cui c'è l'ambiente di sviluppo.

Qualcuno sa darmi una mano su come risolvere?

41 Risposte

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

    Il prefisso "smb://" indica il protocollo usato. In questo caso, il protocollo SMB (Server Message Block) / Samba. Non è un protocollo gestito nativamente dal core di Java, men che meno dalla gestione del File System, ma esistono delle librerie per poterci lavorare.

    Una libreria che uso, è SMBJ.

    Se il tuo è un progetto Maven, aggiungi la seguente dependency:

        <dependency>
           <groupId>com.hierynomus</groupId>
           <artifactId>smbj</artifactId>
           <version>0.13.0</version>
       </dependency>

    Qui la documentazione: https://github.com/hierynomus/smbj

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

    Grazie per il suggerimento! :-)
    In effetti so cosa significa smb, infatti sul mio Debian ho installato Samba.
    Il fatto che non sapevo è che java non lo gestisce nativamente.

    Inoltre sull'argomento dependency sono totalmente impreparato! :-(
    Nei miei programmi fin'ora ho usato interfacce e polimorfismo, ma non avevo mai letto nulla circa le dependency.

    Quindi la mia domanda è: dove devo aggiungere la dichiarazione che mi hai riportato?
    Nella pagina che mi hai indicato e anche altrove dice che devo aggiungerla nel file pom.xml ma non ho idea di dove sia.
    Ho cercato nella struttura delle cartelle del mio progetto, gestito con NetBeans ma non l'ho trovato. 

    Inoltre non ho trovato informazioni circa la possibilità di ottenere la data di modifica di un file come con la fiName.lastModified() oppure di farne una copia come con la Files.copy

    Riesci a darmi qualche dritta?

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

    A meno che l'applicazione non sia composta SOLO da un file sorgente, una NORMALE applicazione che faccia qualcosa di mediamente "intelligente" e' composta da piu' MODULI, ed ogni modulo usa LIBRERIE ESTERNE (robba gia' fatta da altri).

    Per compilare e combinare tutto insieme in modo corretto, si usa un "building system".

    Ora, esistono n-mila building system.

    Maven, di cui il file 'pom.xml' e' il file di configurazione, e' uno tra questi. Un'altro e' Gradle, ma OGNI IDE ha il suo integrato, oltre al fatto che se l'IDE e' mediamente ben fatto, e' in grado di usare Maven e Gradle.

    Ora, il consiglio e' STUDIARE come funziona Maven e come si configura.

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

    17/09/2025 - migliorabile ha scritto:

    Maven, di cui il file 'pom.xml' e' il file di configurazione, e' uno tra questi. Un'altro e' Gradle, ma OGNI IDE ha il suo integrato, oltre al fatto che se l'IDE e' mediamente ben fatto, e' in grado di usare Maven e Gradle.

    Grazie anche a te per le indicazioni.

    Faccio presente che relativamente a Java sono ancora un principiante, anche se sono anni che lo uso, perchè non lo faccio più come lavoro, ma Java ho iniziato ad utilizzarlo per fare applicazioni ad uso personale.

    Ho appena scoperto che tutti i miei progetti, per i quali uso NetBeans utilizzano Ant come "building system", per cui mi sa che cercherò se esistono delle librerie adatte ad Ant.
    Se poi non dovessi trovarne, trasferirò il mio progetto in Maven e cercherò di capire come utilizzare la libreria SMBJ indicata da SpiritoLIbero.
    NetBeans supporta sia Maven che Gradle.

    Grazie comunque ad entrambi che mi avete fatto imparare cose nuove

    Se qualcuno potesse indicarmi un'eventuale libreria adatta ad Ant mi farebbe un gran favore. ;-)

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

    NetBeans, di default, usa Ant come gestore di progetti e non Maven (che, comunque, è supportato), quindi non hai un pom.xml a cui aggiungere una dipendenza (libreria).

    Ti tocca scaricarti il JAR della libreria (e quelli delle librerie collegate) e aggiungerli alla lista delle Libraries di NetBeans, per poi aggiungerlo al tuo progetto.

    La libreria SMBJ si porta dietro i seguenti file:

    • smbj-0.13.0.jar (la libreria)
    • mbassador-1.3.0.jar (dipendenze della libreria)
    • asn-one-0.6.0.jar (dipendenza della libreria)
    • bcprov-jdk15on-1.75.jar (dipendenza della libreria)
    • slf4j-api-2.0.9.jar (dipendenza della libreria)

    Te li dovrai scaricare manualmente, poi andrai a creare una nuova libreria su NetBeans (Menu Tools -> Libraries), aggiungerai a questa tutti i JAR sopra elencati e quindi potrai usarla come una normale libreria da aggiungere al tuo progetto (Tasto destro sul progetto -> Properties -> Libraries -> Add Library).

    Ecco perchè Maven è "più semplice" nella gestione delle librerie, non hai tutto questo sbatti (fa tutto lui in automatico dietro le quinte).

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

    Caro SpiritoLibero sei un mito! 
    Ti ringrazio tantissimo per le indicazioni!

    17/09/2025 - SpiritoLibero ha scritto:

    Te li dovrai scaricare manualmente, poi andrai a creare una nuova libreria su NetBeans (Menu Tools -> Libraries), aggiungerai a questa tutti i JAR sopra elencati e quindi potrai usarla come una normale libreria da aggiungere al tuo progetto (Tasto destro sul progetto -> Properties -> Libraries -> Add Library).

    Ecco perchè Maven è "più semplice" nella gestione delle librerie, non hai tutto questo sbatti (fa tutto lui in automatico dietro le quinte).

    Questo non è un problema. Ne ho già create parecchie di librerie sia con file jar di altri che miei. ;-)

    Mi sono scaricato tutti i file che hai indicato, ho creato una libreria in NetBeans con dentro tutti i file.
    Ho aggiunto la libreria al progetto.
    Poi ho cercato sul web un esempio di utilizzo della libreria e ho trovato questo:

    --------------------------------------------------------------------------------
       SMBClient client = new SMBClient();
       try (Connection connection = client.connect("smb://NomeNas")) {
         AuthenticationContext ac = new AuthenticationContext("User", "Password".toCharArray(), "Domain");
         Session session = connection.authenticate(ac);
                                                                 // Connect to Share.
         try (DiskShare share = (DiskShare) session.connectShare("NomeShare")) {
           for (FileIdBothDirectoryInformation f : share.list("Directory", "*.*")) {
             System.out.println("File : " + f.getFileName());
           }
         }
       } catch (IOException ex) {
         Logger.getLogger(IntBckFrm.class.getName()).log(Level.SEVERE, null, ex);
       }
    --------------------------------------------------------------------------------

    Ovviamente ho sostituito i nomi generici con i dati corretti del mio ambiente, ma eseguendo il programma mi da errore sulla:
        try (Connection connection = client.connect("smb://NomeNas")) {

    SLF4J: No SLF4J providers were found.
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
    Sep 18, 2025 5:55:49 PM Main.IntBckFrm ItemShowFilesActionPerformed
    SEVERE: null
    java.net.UnknownHostException: smb://NomeNas

    Ho cercato da cosa potrebbe essere dovuto, ma non riesco a capirci nulla!

    Hai qualche idea?

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

    Questa e' la parte divertente:

    la libreria A usa la libreria B

    la libreria B usa la lbreria C

    ...

    e cosi' via, riscorsivamente, con cicli e con complicate dipendenze di versione.

    Questo e' il motivo per cui si usa un building system.

    Oppure, con tanta pazienza, si risolvono le dipendenza A MANO.

    Ma non e' facile come sembra.

    Quando scarichi una libreria, non puoi scaricare l'ultima che ti capita, ma bisogna scaricare la versione giusta.

    E come si fa?

    E bravo furbo. Se fosse facile, lo saprebbero fare tutti.

    Di nuovo: e' responsabilita' del building system smazzarsi la rogna.

    E anche lui ogni tanto non ci capisce un'accidente.

    Esempio:

    la libreria A richede la libreria C in versione v1

    la libreria B richiede la libreria C in versione v2

    La versione v1 e' incompatibile con la versione v2 della libreria C.

    Quindi?

    Quindi niente, cosi' non si puo' fare. STOP.

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

    L'errore E' OVVIO:

    non sa che cosa sia 'NomeNas'!

    scrivi

    ping NomeNas 

    sulla console del tuo PC.

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

    17/09/2025 - SpiritoLibero ha scritto:

    • smbj-0.13.0.jar (la libreria)
    • mbassador-1.3.0.jar (dipendenze della libreria)
    • asn-one-0.6.0.jar (dipendenza della libreria)
    • bcprov-jdk15on-1.75.jar (dipendenza della libreria)
    • slf4j-api-2.0.9.jar (dipendenza della libreria)

    A seguito dell'indicazione di migliorabile sulle versioni delle librerie, mi sono accorto che ho scaricato tutte le versioni indicate tranne quella della bcprov-jdk, perché in questa pagina delle dipendenze di smbj-0.13.0:
    https://central.sonatype.com/artifact/com.hierynomus/smbj/0.13.0/dependencies

    indica la versione bcprov-jdk18on-1.75.jar che io ho scaricato, e non riesco a trovare la 15.

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

    19/09/2025 - migliorabile ha scritto:

    non sa che cosa sia 'NomeNas'!

    scrivi

    ping NomeNas 

    sulla console del tuo PC.

    E qui casca di nuovo l'asino... cioè io... perché entrano in gioco le mie carenze da sistemista.

    Ho provato a fare il ping che hai indicato ed in effetti non lo vede.

    Ma allora mi nasce spontanea la domanda: come mai il file manager lo vede e ci accedo tranquillamente in lettura e scrittura?

    Per completezza, uso Debian 12.12 con Xfce che usa Thunar come file manager.
    E se dalla mia applicazione per eseguire i programmi oppure da terminale do il comando: exo-open --launch FileManager smb://NomeNas/ mi fa partire una sessione di Thunar che accede al NAS.

    Cos'è che non so sull'argomento?
    Per caso Thunar usa un protocollo differente?

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

    Il metodo connect vuole l'indirizzo del Nas, non l'URL (quindi, togli "smb://").

    Se per qualche ragione non riesce a risolvere il nome host, prova ad usare direttamente l'IP del Nas.

    In merito a questa istruzione:

    AuthenticationContext ac = new AuthenticationContext("User", "Password".toCharArray(), "Domain");

    La stringa "Domain" rappresenta il nome del dominio. Il nome del dominio va usato se e solo se il Nas è a dominio (generalmente in ambiente Windows), altrimenti metti una stringa vuota.

    Se dal terminale dai il seguente comando:

    getent hosts NomeNas

    riesci ad ottenere l'IP del Nas? Se non lo riesci ad ottenere significa che il sistema non riesce a risolvere il nome host e dovrai per forza usare l'IP.

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

    19/09/2025 - migliorabile ha scritto:

    scrivi

    ping NomeNas 

    sulla console del tuo PC.

    In effetti usando il nome del NAS non lo vede, mentre usando l'indirizzo IP lo vede.

    Ma purtroppo non mi ha risolto il problema...

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

    19/09/2025 - SpiritoLibero ha scritto:

    Il metodo connect vuole l'indirizzo del Nas, non l'URL (quindi, togli "smb://").

    Se per qualche ragione non riesce a risolvere il nome host, prova ad usare direttamente l'IP del Nas.

    Allora ho fatto ennemila prove, togliendo "smb://" etc. ma l'unica che ha funzionato è stata con l'Indirizzo IP che ho copiato dall'interfaccia del router, perché in passato a causa di problemi di accesso alla LAN da parte di Debian avevo impostato gli indirizzi IP dei NAS e dei miei pc come fissi.

    In merito a questa istruzione:

    AuthenticationContext ac = new AuthenticationContext("User", "Password".toCharArray(), "Domain");

    La stringa "Domain" rappresenta il nome del dominio. Il nome del dominio va usato se e solo se il Nas è a dominio (generalmente in ambiente Windows), altrimenti metti una stringa vuota.

    Sia usando il nome del dominio oppure lasciando la stringa vuota il risultato non cambia.
    Il risultato è un messaggio di warning:

    SLF4J: No SLF4J providers were found.
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.


     seguito da queste due righe:

    File : .
    File : ..

    Se dal terminale dai il seguente comando:

    getent hosts NomeNas

    riesci ad ottenere l'IP del Nas? Se non lo riesci ad ottenere significa che il sistema non riesce a risolvere il nome host e dovrai per forza usare l'IP.

    Il comando che mi hai indicato non mi da niente, ma come dicevo, usando l'indirizzo IP nalla client.connect non mi da più errore.


    Ora devo capire perché non mi fa vedere i file.
    Ho provato a cambiare il nome della share e della cartella, ma nulla.
    Spero che con nella session.connectShare il nome della share significhi una delle cartelle che il NAS condivide, ovvero quelle che ho creato tramite l'interfaccia di gestione del NAS e dentro le quali poi normalmente ci copio le cartelle del disco fisso del mio pc tramite il file manager.

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

    20/09/2025 - ZioCrick ha scritto:

    Allora ho fatto ennemila prove, togliendo "smb://" etc. ma l'unica che ha funzionato è stata con l'Indirizzo IP che ho copiato dall'interfaccia del router, perché in passato a causa di problemi di accesso alla LAN da parte di Debian avevo impostato gli indirizzi IP dei NAS e dei miei pc come fissi.

    Questo perchè, come hai detto più avanti, il sistema non riesce a risolvere il nome dell'host. Poco male.

    Sia usando il nome del dominio oppure lasciando la stringa vuota il risultato non cambia.
    Il risultato è un messaggio di warning:

    SLF4J: No SLF4J providers were found.
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.

    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.


     seguito da queste due righe:

    File : .
    File : ..

    Ovvero le due directory standard.

    Il comando che mi hai indicato non mi da niente, ma come dicevo, usando l'indirizzo IP nalla client.connect non mi da più errore.

    Esatto: se non riesce a risolvere il nome host si va con l'IP.


    Ora devo capire perché non mi fa vedere i file.
    Ho provato a cambiare il nome della share e della cartella, ma nulla.
    Spero che con nella session.connectShare il nome della share significhi una delle cartelle che il NAS condivide, ovvero quelle che ho creato tramite l'interfaccia di gestione del NAS e dentro le quali poi normalmente ci copio le cartelle del disco fisso del mio pc tramite il file manager.

    Sì, è il nome con cui la cartella viene vista nella share di rete.

Devi accedere o registrarti per scrivere nel forum
41 risposte