View Full Version : [JAVA] LIST per FTP Server
fbcyborg
19-07-2005, 15:35
Ciao Ragazzi, ho bisogno sul serio di un vostro consiglio. Ho quasi terminato la realizzazione di un server FTP secondo le rfc 959. C'è solo una cosa che non riesco a fare...
Quando il server riceve un LIST, invia il contenuto della directory locale al client. Ho assoluto bisogno di sapere come produrre in java un listato simile a questo:
drwxrwxr-x 2 root bin 7168 Mar 18 05:13 .
drwxrwxr-x 25 root sys 1024 Jan 7 09:16 ..
-r-sr-xr-x 1 root bin 32868 Jan 29 05:13 login
-r-xr-xr-x 1 bin bin 17500 Oct 25 1995 ls
-r-x--s--x 1 bin mail 66208 Jan 6 20:16 mail
ovvero il risultato di un "ls -al" unix fattibile anche da windows.
Grazie mille.. spero che mi aiutiate a risolvere il problema!
...mh...penso tu debba ricreartelo esegundo per ogni file comandi come MDTM e SIZE...
...ciao...
fbcyborg
19-07-2005, 20:47
ciao, grazie x il supporto innanzi tutto..
per favore potresti essere un po' più preciso che non conosco tali sistemi???
...ci sono diversi modi per interfacciarsi ad un FTP da java...l'idea di base è quella di creare una connessione e due stream per dialogare con il server...
try {
URL url = new URL("ftp://user:
[email protected]");
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream();
OutputStream os = urlc.getOutputStream();
} catch (Exception e) {
e.printStackTrace();
}
...ecco un elenco dei piu' comuni comandi utilizzabili...
* ABOR - abort a file transfer
* CWD - change working directory
* DELE - delete a remote file
* LIST - list remote files
* MDTM - return the modification time of a file
* MKD - make a remote directory
* NLST - name list of remote directory
* PASS - send password
* PASV - enter passive mode
* PORT - open a data port
* PWD - print working directory
* QUIT - terminate the connection
* RETR - retrieve a remote file
* RMD - remove a remote directory
* RNFR - rename from
* RNTO - rename to
* SITE - site-specific commands
* SIZE - return the size of a file
* STOR - store a file on the remote host
* TYPE - set transfer type
* USER - send username
...con questi puoi interrogare il server...inviare e ricevere file ed informazioni su questi...
...domani se riesco ti posto qualcosa di piu' concreto...
...ciao...
fbcyborg
19-07-2005, 23:34
Ciao! grazie, vedo che ti sei impegnato a rispondermi....
volevo dirti innanzitutto che non è necessario che mi spieghi la parte di networking.. E' già tutto realizzato e pienamente funzionante. Ho implementato sia un client che un server ftp.
L'unico fatto è che quando arriva una richiesta di tipo LIST al server, quest'ultimo dovrebbe spedire un listato dei files al client. OK, fin quì ci siamo.
Il mio problema è: dato che il metodo list() della classe File nel package java.io restituisce la semplice lista dei files contenuti nella directory specificata, a me serve un listato un po' più sofisticato. Conosco le RFC 959, e i vari comandi del protocollo. Sto realizzando il lato server ed ho bisogno di mandare al client che mi fa un LIST una lista di files che è l'equivalente di un ls -al unix, che faccia vedere TUTTI gli attributi di un file o di una directory.
Suppongo, anzi sono certo che questo problema prescinda dal protocollo FTP. Quindi mi basterebbe un semplice metodo main che lanciato da una directory (la sua classe chiaramente) mi restituisca un ls -al anche se lo lancio da windows.
Chiedo questo poichè provando dei comuni server ftp scaricabili in prova da internet, come x esempio UServ-FTP server, alla ricezione del comando LIST (dir se parliamo in termini di client ftp di windows) spedice un ls -al della dir attuale. Posso immaginare che tale software sia scritto in c o in c++ o in chissà quale altro linguaggio, ma perchè in java non posso simulare un ls -al unix???? Spero esista un sistema.
Spero di essere stato un po' più chiaro ora...
Grazie infinite...
PS: se devo crearmelo da solo... mi armo di pazienza....
...ok quindi stai cercando un modo...anche da locale...di eseguire comandi da shell e ricavarne l'output?...se è così interesserebbe anche a me...
...la soluzione dovrebbe essere circa così...
{
Runtime r = Runtime.getRuntime();
String cmd = "comando";
Process prc = r.exec(cmd);
BufferedReader is = new BufferedReader(new InputStreamReader(prc.getInputStream()));
String line;
while ((line = is.readLine()) != null)
System.out.println(line);
}
...ciao...
...ok quindi stai cercando un modo...anche da locale...di eseguire comandi da shell e ricavarne l'output?...se è così interesserebbe anche a me...
Credo che stia cercando un modo per recuperare gli attributi di ogni file presente in una directory...
fbcyborg
20-07-2005, 10:19
MI serve un ls -al UNIX. Anche da Winsozz..
MI serve un ls -al UNIX. Anche da Winsozz..
...l'ultimo stralcio di codice da me postato puo' eseguire tale funzione...ma da locale...
...ciao...
fbcyborg
20-07-2005, 12:11
OK! grazie... ma devo cambiare qualcosa?
In questo modo lui si deve prendere l'output del comando (un attrib avrà un output diverso da ls -la) e rileaborarselo... Ricordatevi che in Windows gli attributi non sono come quelli di Linux, ma devono essere rielaborati... IMHO è sempre una brutta abitudine prendere l'output di un comando...in qualsiasi linguaggio o sistema operativo... Poi soprattutto in Java che dovrebbe essere portabile...
Non basta usare un funzione che ottiene gli attributi di un file e dopo applicarla a tutti i file ?
fbcyborg
20-07-2005, 20:49
ally: ho provato a fare come dici.. non ci riesco però:
ecco la classe:
import java.io.*;
public class List {
public static void main(String[] args) throws IOException{
Runtime r = Runtime.getRuntime();
String cmd = "comando";
Process prc = r.exec(cmd);
BufferedReader is = new BufferedReader(new InputStreamReader(prc.getInputStream()));
String line;
while ((line = is.readLine()) != null)
System.out.println(line);
}
}
ed ecco la runtime exception:
Exception in thread "main" java.io.IOException: CreateProcess: comando error=2
at java.lang.Win32Process.create(Native Method)
at java.lang.Win32Process.<init>(Win32Process.java:66)
at java.lang.Runtime.execInternal(Native Method)
at java.lang.Runtime.exec(Runtime.java:566)
at java.lang.Runtime.exec(Runtime.java:428)
at java.lang.Runtime.exec(Runtime.java:364)
at java.lang.Runtime.exec(Runtime.java:326)
at List.main(List.java:7)
...mh...mi dispiace...domani ricontrollo...
...ciao...
Grazie per avermi ignorato :D
Grazie per avermi ignorato :D
...beh è in parte cio' che avevo consigliato all'inizio...usando comandi specifici ftp per ricostruire le proprietà del file...il problema è capire se questa cosa deve essere fatta da remoto o da locale...
...ciao...
...beh è in parte cio' che avevo consigliato all'inizio...usando comandi specifici ftp per ricostruire le proprietà del file...il problema è capire se questa cosa deve essere fatta da remoto o da locale...
Da locale... Lui sta scrivendo il server e non deve usare i comandi FTP...basta applicare questa classe: http://java.sun.com/j2se/1.5.0/docs/api/java/io/FilePermission.html
Questi sono i permessi su quel file per la sua applicazione...e di fatto gli altri basta simularli... Anche perchè non credo che lui voglia creare "Gruppi" sul suo FTP server... Se li vuoi usare allora devi passare a creare un virtual file system per cui nella configurazione del FTP server verrano specificati i tipi di accesso a tutti, gruppo e utente per quelal directory...un po' come fa WarFTP Server...
fbcyborg
21-07-2005, 08:58
cionci: grazie per questo link che mi hai mandato... vedo subito di che si tratta!!!
Quindi in pratica per questa classe io posso ottenere quei famosi attributi
-xwr-ww-w ecc... x i files
dwr ecc... per le dir?
...ottimo...non conoscevo questa classe...
...ciao...
...mh...mi dispiace...domani ricontrollo...
...ciao...
...il problema dovrebbe essere legato al comando da lanciare...
...String cmd = "cmd /c dir";
...così lancia il comando dir dal path del programma...
...ciao...
Ottieni solo gli attributi per il tuo programma...gli altri devi simularli... Ad esempio mettendoli sempre a 1...
Per la dir...io non mi intendo per niente di Java comunque se credo che non impossibile da trovare...
fbcyborg
21-07-2005, 09:26
OK! adesso ho capito ... dovevo impostarlo il comando.... :D
certo che se ci fosse qualcuno che abbia implementato ls anche per windows avrei risolto un problema e creato un'altro... perchè se poi faccio girare il server su linux è un bordello.....
a meno che non ci sia un metodo java che mi restituisca la piattaforma....
del tipo:
se sei su windows lancia il programma ls unix riscritto per windows
se sei su linux lancia /bin/ls -al
Oppure cercherò di vedere se riesco a produrre un ls -al da java.. anche se penso sia un'impresa
cionci: provo e ti faccio sapere
Allora per vedere se un file è una directory basta usare isDirectory sull'oggetto File...
Ora manca la classe per ottenere la lista di tutti i file all'interno di una dorectory...
OK! adesso ho capito ... dovevo impostarlo il comando.... :D
certo che se ci fosse qualcuno che abbia implementato ls anche per windows avrei risolto un problema e creato un'altro... perchè se poi faccio girare il server su linux è un bordello.....
a meno che non ci sia un metodo java che mi restituisca la piattaforma....
del tipo:
se sei su windows lancia il programma ls unix riscritto per windows
se sei su linux lancia /bin/ls -al
Oppure cercherò di vedere se riesco a produrre un ls -al da java.. anche se penso sia un'impresa
Ripeto...lanciare un comando da Java è brutto, molto brutto...e soprattutto non portabile...
fbcyborg
21-07-2005, 09:30
Allora per vedere se un file è una directory basta usare isDirectory sull'oggetto File...
Ora manca la classe per ottenere la lista di tutti i file all'interno di una dorectory...
No problem: File.list()
fbcyborg
21-07-2005, 09:31
Ripeto...lanciare un comando da Java è brutto, molto brutto...e soprattutto non portabile...
appunto.. l'ho scartata come opzione
A te non interessano i permessi completi (per tutti e per il gruppo, ma solo quelli per l'utente attuale)...
E' più semplice di quello che pensavo...
File f = new File(path_attuale);
File fList[] = f.list();
int d[fList.Lenght()]; //ho tirato a caso spero che si faccia così...
int r[fList.Lenght()];
int w[fList.Lenght()];
for(int i=0; i<fList.Lenght(); ++i)
{
if(fList[i].isDirectory())
d[i] = 1;
else
d[i] = 0;
if(fList[i].canRead())
r[i] = 1;
else
r[i] = 0;
if(fList[i].canWrite())
w[i] = 1;
else
w[i] = 0;
}
Execute ti serve ? Direi di no...
fbcyborg
21-07-2005, 10:07
OK grazie mitico!!!!
più o meno ci stiamo arrivando a quello che vorrei io.. anche se molto lentamente... :D
Ritoccando un po' il codice che mi hai dato sono riuscito ad ottenere un output decente...
import java.io.*;
public class List {
public static void main(String[] args) throws IOException{
File f = new File(System.getProperty("user.dir"));
String[] fList = f.list();
char[] d = new char[fList.length];
char[] r = new char[fList.length];
char[] w = new char[fList.length];
for(int i=0; i<fList.length; ++i)
{
if(new File(fList[i]).isDirectory())
d[i] = 'd';
else
d[i] = '-';
if(new File(fList[i]).canRead())
r[i] = 'r';
else
r[i] = '-';
if(new File(fList[i]).canWrite())
w[i] = 'w';
else
w[i] = '-';
}
System.gc();
for(int j=0;j<fList.length;j++){
System.out.println(d[j] + " " + r[j] + " " + w[j] + " " + fList[j]);
}
System.exit(0);
}
}
Grazie...
ora che penso di essere sulla buona strada, cercherò di renderlo il più possibile al ls unix
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.