Newsgroup: it.comp.java
Titolo: Aiuto!! IO di files da file con Java

Salve a tutti il mio problema è il seguente:
Devo creare una classe che partendo da un file con estensione .INI
(Strutturato nella seguente maniera
NomeFile=PathPartenza:PathArrivo
NomeFile=PathPartenza:PathArrivo
NomeFile=PathPartenza:PathArrivo
ecc....)
Vada a fare la copia (meglio se una move) del file dalla directory di partenza
a quella di arrivo.
Ho scitto un pò di codice che non riesco a farlo quadrare qualcuno mi può aiutare.
Sicuramente ci saranno un bel pò di c.....e DOVE SBAGLIO
LISTATO
//Esegue un uscita dal programma con una scrittura
private static void quit ( String str)
     {
        System.out.println ( str ) ;
        System.exit ( 1 ) ;
      }
    // -------------------------------------------------------------------------
    // Legge un parametro dal file ini
    // -------------------------------------------------------------------------
    public String FinalMove(String strFile) {
        FileReader fr = null;
        try{
            fr = new FileReader(strFile);
            BufferedReader br = new BufferedReader(fr);
            String s;
            String sfile = null;
            String sdest = null;
            String ssource = null;
            int i1 = 0; // inizio riga
            int i2 = 0; // =
            int i3 = 0; // :
            char ch;
            while((s = br.readLine()) != null){
                if (!s.startsWith(";")){
                }
                //esttraggo file source e dest
                i2 = s.indexOf("=");
                i3 = s.indexOf(":");
                sdest = s.substring(s.indexOf(":")+1);
                sfile = s.substring(i1,i2);
                ssource = s.substring(i2+1,i3);
               }
            fr.close();
        }
        catch (IOException e){}
        //return(null);
 
    public static void CopyFile (char[])
  {
    // Varibles to hold source and destination files
    String sourceFileName ;
    String targetFileName ;
    // Temporary string object to get input from user
    String temp = "" ;
 
      sourceFileName = ssource + "\\" + sfile;
      targetFileName = sdest + "\\" + sfile ;
      // Check if source file exists
      File source = new File ( sourceFileName ) ;
      if ( !source.exists() )
      {
        quit ( sourceFileName + " non esiste." ) ;
      }
      // Check if source is a file
      if ( !source.isFile ( ) )
      {
        quit ( sourceFileName + " non e' un file." ) ;
      }
      // Check if target file exists
      File target = new File ( targetFileName ) ;
      if ( target.exists() )
      {
        // Prompt user for overwriting the target file
        System.out.print ( "\nSovrascrivere " + targetFileName + " (Y/N)?" ) ;
        try
        {
          temp = in.readLine ( ) ;
          if ( temp == null )
          {
             quit ( "Problema sconosciuto" ) ;
          }
          if ( !temp.toUpperCase().equals( "Y" ) )
          {
             quit ( "" ) ;
          }
        }
        catch ( IOException e )
        {
          quit ( "Problema sconosciuto" ) ;
        }
      }
      // Prepare the input and output streams for final file copy
      BufferedWriter out = null ;
      try
      {
        out = new BufferedWriter ( new FileWriter ( target ) ) ;
        in = new BufferedReader ( new FileReader ( source ) ) ;
      }
      catch ( IOException e )
      {
        quit ( "Problema sconosciuto") ;
      }
      try
      {
         int ch ;
         ch = in.read ( ) ;
          while ( ch != -1 )
         {
            out.write ( ch ) ;
            ch = in.read ( ) ;
         }
      }
      catch ( IOException e ) { }
      finally
      {
          try
          {
            in.close ( ) ;
            out.close ( );
          }
          catch ( IOException e ) { }
}

a quella di arrivo.
[CUT]
Copia e move sono cose diverse: quale vuoi ottenere?
Se è la seconda, usa File.renameTo() (vedi documentazione).
HTH
-- 
Ciao
	Fabrizio C.

 HTH
Sì, ma prendi la "File.renameTo()" con le molle, in quanto se sei in un 
ambiente
distribuito e il filesystem è NFS la renameTo non funziona, ritorna
false senza nemmeno lanciare una Exception che spieghi il motivo
del fallimento.
<LOGORROICO-SAPIENTINO MODE="ON">
Si tratta di implementazioni diverse del layer C che sta sotto a Java;
la "move" in Unix è una istruzione atomica, mentre nel mondo Win si
esegue in 2 passi e, se dovessero esserci problemi in mezzo tra i due
ci si troverebbe in uno stato inconsistente.
O forse era il contrario? L'ho visto troppo tempo addietro e non
ricordo di preciso, comunque la sostanza è che la "File.renameTo()" non
è portabile o, comunque non si deve utilizzare quando si utilizzano dei
filesystem montati da remoto.
Per molti sviluppatori Java questo è un bug, mentre la Sun ritiene che
sia perfettamente in linea con la filosofia del linguaggio e non ha
intenzione di correggere questa situazione.
Se Ugo Landini è in ascolto, magari può darci qualche spiegazione più
esauriente, giusto per evitare di scoprirlo il giorno del rilascio come
è successo a me.
</LOGORROICO-SAPIENTINO>
A proposito; qualcuno sa se c'è un workaround che non sia la
copia/cancellazione con gli Stream?
Fortunatamente la mia piattaforma di riferimento era Solaris (e non
cambierà per almeno 5 anni) e me la sono cavata invocando "mv" come un
processo esterno, ma mi piacerebbe sapere se ci sono alternative più
eleganti.
Ciao a tutti,
     Rob