Newsgroup: it.comp.java
Titolo: domandina facile

Ciao a tutti
Sto cercando di spostare un file da una directory all'altra. Ho usato il
metodo renameTo() della classe file ma alcune volte lo spostamento non me
lo fa fare. 
Ho notato inoltre che il file che cerco di spostare è come se fosse
loccato, infatti se provo a rinominarlo a mano dice che è in uso. 
Sapete per caso darmi qualche dritta su una maniera alternativa per
spostare i files oppure spiegarmi perchè mi blocca in questo modo i file
che voglio spostare?
Grazie 1000
Alessandra 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Se un file è in lock da un processo, il sistema operativo (giustamente) 
ne impedisce la cancellazione. Poiché l'operazione di spostamento altro 
non è che un copia ed un cancella, non va a buon fine.
La domanda che ti devi porre è chi tiene in lock il file e chiudere 
tutti i processi associati a questo, poi lanciare la procedura... Quindi 
il problema non è proprio di programmazione, quanto di... comprensione!
In bocca al lupo ;)
Gian Luca

 loccato, infatti se provo a rinominarlo a mano dice che è in uso. 
[ ... ]
Se il file loccato è utilizzato solo dalla tua applicazione potrebbe 
essere rimasto uno stream aperto sul file.
Verifica se in qualche altro punto del codice dove hai un new 
FileInputStream/FileOutputStream sul file, ci sia anche un'istruzione 
close() (dello stream) che sia _sempre_ raggiungibile.
Io per sicurezza gli stream sui file li gestisco con un blocco 
try/catch/finally e nel finally metto le istruzioni close().
ciao
-- 
mauro

 non è che un copia ed un cancella, non va a buon fine.
Però non è così su tutti i sistemi operativi.
Sui vari *nix un processo può aprire un file e lavorarci e un altro
processo può eliminare il file (unlink, cioé scollega i nodi dei
dati dall'albero del filesystem).
E' tutto perfettamente regolare, se si hanno i permessi di farlo.
Ciao
gl :)

 try/catch/finally e nel finally metto le istruzioni close().
Però se fosse così, sistematicamente dovrebbe darmi il problema, invece
questo problema lo da random e tra l'altro non sempre sullo stesso file;
infatti a volte mi si "blocca" un file diverso.
Comunque ho controllato la chiusura di tutti i file
FileInputStream/FileOutputStream ed è corretta.
Ora per aggirare il problema, mi sto creando un file .bat che sposti i
file da una directory all'altra così il metodo renameTo() utilizzato
indebitamente non lo uso più.
Domandina .... ^_^
Il mio programma è un demone che gira in background. 
Se da questo eseguo il comando: 
Runtime.getRuntime().exec("prova.bat");
il file prova.bat dove si deve trovare???
Grazie ancora a tutti


 il file prova.bat dove si deve trovare???
Dove vuoi... Se lo scrivi così deve essere dentro in un directory
specificata nella PATH, altrimenti devi specificare te il percorso (ad es.
exec("./bin/prova.bat"); ).
Ciao,
Alessandro
-- 
----------------
email: 
el_contadin...@libero.it
---------------


 cya Nicola
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Però se fosse così, sistematicamente dovrebbe darmi il problema, 
Beh non è detto, magari scrivi un po' di codice. Puo' darsi che per qualche
ragione a volte venga eseguito il ramo di che chiude gli stream altre volte
no. O a volte non vengono chiusi in tempo.
Più che altro mi chiderei se renameTo() funziona quando bisogna spostare tra
due partizioni diverse, cioé quando è proprio indispensabile una copia del
contenuto.
Tra l'altro un altro metodo piuttosto ovvio è creare il file destinazione,
copiarci il contenuto del file sorgente ed eliminare il file sorgente.
Questo sicuramente funziona sempre
Ciao
Matteo
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it/imsv/



Bisogna anche vedere se il processo che sta aprendo il file ha richiesto un
lock esclusivo... Guardando la documentazione:
http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/FileChannel.html
vedo che è possibile dall'interno della JVM richiedere un lock sull'intero
file o su parte di esso, lock che si riflette anche al di fuori della JVM
stessa.
Ovviamente può sempre arrivare un bel kill da root che termini la jvm e
liberi tutti i lock del processo... ma questa è un'altra storia...
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
  ---  
http://xenu.freewinds.cx
(per rispondere personalmente leva IlDitoDalCulo)

gl :) ha scritto:

Hai ragione, è che parto sempre da due presupposti:
	Se si è sotto Windows, spesso è il sistema che si incarta e lascia i 
lock sul file.
	Se si lavora sotto unix... Non si è mai root :(
	A presto ;)
	Gian Luca

 Se si lavora sotto unix... Non si è mai root :(
Già, ma è anche possibile il caso di un file dell'utente pippo a cui
accede pluto. Pippo cancella il file (è suo, può farlo) e pluto può
ancora lavorarci, anzi potrebbe ancora (ri)scrivere i dati su disco.
I casi in verità sono tanti, sui sistemi operativi multiutente (e questo
dimostra ancora una molta la natura monoutente di windows)
Ciao!
gl :)

Grazie ragazzi, 
ho trovato una soluzione. Anzi due. 
La prima è che sono pienamente consapevole che utilizzo un metodo
(renameTo()) che non dovrei usare per questa operazione, quindi sarebbe
cosa giusta aprire un file nuovo, copiare in contenuto del vecchio e
cancellare quest'ultimo.
La seconda è creare un file bach che sposti tutti i file dopo che il mio
programma ha finito di crearli tutti.
Credo che utilizzerò la seconda in quanto i file da spostare sono molti e
di parecchi mb. 
Grazie a tutti per i chiarimenti che mi avete dato.


gl :) ha scritto:

Tutto vero ;)
Mi sa che anche tu ci lavori un po' eh :D
A presto