Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Rinominare file

  1. #1

    Rinominare file

    Salve ho un problema con un Fila.
    Devo creare un file di aggiornamento e eseguire quindi queste operazioni:
    codice:
    			File inFile=new File("file.txt");
    			Scanner scan = new Scanner(inFile);
    					
    					//APRO FILE DI OUTPUT
    					File out=new File("file_agg.txt");
    					PrintStream scrivi=new PrintStream(out);
    
                           //faccio alcune operazioni di modifica del file
                      ....................
    		
                      if (!inFile.delete()) System.out.print("File Non Eliminato");
    
    			/*	CREO IL FILE DI AGGIORNAMENTO CON LA PRENOTAZIONE NUOVA	*/
     			inFile.delete();
    			
    			
    			boolean Rinomina = out.renameTo(inFile);
    				if(!Rinomina){System.out.println("File o directory non rinominati. PRENOTAZIONE NON COMPLETATA.");}
    il problema che riscontro è che non mi fa eliminare il vecchio file perchè mi dice che e ancora in uso e di conseguenza non mi fa rinominare il file d'aggiornamento. Come posso risolvere??

  2. #2
    Il printstream che usi per fare le modifiche al file sei sicuro di chiuderlo prima di cercare di rinominarlo?

  3. #3
    Si lo chiudo prima facendo scrivi.close()

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Posta tutto il codice, così da vedere quali possano essere i motivi.
    Tieni presente che le operazioni di chiusura degli stream andrebbero fatte all'interno di un blocco finally di un try/catch, in modo da garantire che l'istruzione venga eseguita.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Postare tutto il codice sarebbe troppo lungo, riesco a postare il metodo in questione:
    codice:
    public void addPrenotazione(ArrayList<Posto> a){
    		try{
    			File inFile=new File("file1.txt");
    			Scanner scan = new Scanner(inFile);
    					
    					//APRO FILE DI OUTPUT
    					File out=new File("file1_agg.txt");
    					PrintStream scrivi=new PrintStream(out);
    					
    			int h=0;
    			while(scan.hasNext()){
    				//riempio l'arraylist con i dati del file
    				linee.add(new Posto(scan.next().charAt(0),scan.nextInt(),scan.nextInt()));
    				System.out.println(linee.get(h).fila+" "+linee.get(h).posto+" "+linee.get(h).flagDis);
    				h++;
    			}
    			scan.close();
    			
    			int i = 0,j =0;
    			while(i<a.size()) {
    				if(a.get(i).fila==linee.get(j).fila && a.get(i).posto==linee.get(j).posto){
    					linee.get(j).flagDis+=1;
    					i++;
    					j++;
    				}
    				else {j++;}
    			}
    			
    			for(int k=0;k<linee.size();k++){
    				scrivi.println(linee.get(k).fila+" "+linee.get(k).posto+" "+linee.get(k).flagDis);
    			}
    			scrivi.close();
    			scan.close();
    			
    			if (!inFile.delete()) System.out.print("File Non Eliminato");
    
    
    			/*	CREO IL FILE DI AGGIORNAMENTO CON LA PRENOTAZIONE NUOVA	*/
    			inFile.delete();
    			
    			
    			boolean Rinomina = out.renameTo(inFile);
    				if(!Rinomina){System.out.println("File o directory non rinominati. PRENOTAZIONE NON COMPLETATA.");}		
    		}
    		catch(IOException e){
    	            System.out.println("Errore file non presente: " + e);
    	            System.exit(1);
    	        }
    HELPP!!

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Così com'è strutturato non va bene e ci sono diversi errori:

    1) Cerchi di eliminare 2 volte il file "inFile".
    2) Non effettui il flush delle scritture, con il rischio di perdere eventuali dati ancora bufferizzati e non scritti
    3) L'intera gestione delle eccezioni e, di conseguenza, dei try/catch non va affatto bene.
    4) In caso di eccezione non stampi lo stackTrace, ma uccidi sia l'eccezione che l'intero processo... per l'intero processo è una tua scelta, per l'eccezione consiglierei di stampare lo stackTrace, altrimenti non saprai mai per quale ragione reale il processo è morto.


    Ho cercato di dare una raddrizzata al tuo codice (non mi sono preoccupato di controllare la correttezza di letture/scritture e altri eventuali calcoli). Prova a vedere come va:

    codice:
        public void addPrenotazione(ArrayList<Posto> a) {
    
            // Dichiariamo e inizializziamo gli oggetti File
            File inFile = new File("file1.txt");
            File out = new File("file1_agg.txt");
    
            // Dichiariamo (e inizializziamo a null) gli stream
            Scanner scan = null;
            PrintStream scrivi = null;
            try {
                scan = new Scanner(inFile);
    
                //APRO FILE DI OUTPUT
                scrivi = new PrintStream(out);
    
                int h = 0;
                while (scan.hasNext()) {
                    //riempio l'arraylist con i dati del file
                    linee.add(new Posto(scan.next().charAt(0), scan.nextInt(), scan.nextInt()));
                    System.out.println(linee.get(h).fila + " " + linee.get(h).posto + " " + linee.get(h).flagDis);
                    h++;
                }
    
                int i = 0, j = 0;
                while (i < a.size()) {
                    if (a.get(i).fila == linee.get(j).fila && a.get(i).posto == linee.get(j).posto) {
                        linee.get(j).flagDis += 1;
                        i++;
                        j++;
                    } else {
                        j++;
                    }
                }
    
                for (int k = 0; k < linee.size(); k++) {
                    scrivi.println(linee.get(k).fila + " " + linee.get(k).posto + " " + linee.get(k).flagDis);
                }
    
                // Se vuoi evitare di perdere la roba bufferizzata e non scritta, forza un flush!
                scrivi.flush();
    
             } catch (Exception e) {
    
                // Mai ammazzare le eccezioni!
                e.printStackTrace();
                System.exit( 1 );   // Boh... vedi tu
    
             } finally {
    
                // La chiusura degli stream va fatta nel finally!
                if (scan != null) {
                   try { scan.close(); } catch (Exception e) { }
                }
                if (scrivi != null) {
                   try { scrivi.close(); } catch (Exception e) { }
                }
    
             }
    
             // Ora i file sono disponibili e possiamo lavorarci su
             if (!inFile.delete()) {
                 System.out.print("File Non Eliminato");
             }
    
             boolean Rinomina = out.renameTo(inFile);
             if (!Rinomina) {
                 System.out.println("File o directory non rinominati. PRENOTAZIONE NON COMPLETATA.");
             }
        }
    Ultima modifica di LeleFT; 24-12-2014 a 10:04
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    guarda ho un po ordinato il tuo codice separando i passi (e cercando di farti vedere che in questo modo loggando per bene è più facile capire in quale punto il problema si crea).

    codice:
    public void addPrenotazione(ArrayList<Posto> a){
            // Sarebbe meglio separare le operazioni, in realtà andrebbero in metodi differenti
            // credo che linee sia una variabile globale
            
            File out=new File("file1_agg.txt");
            File inFile=new File("file1.txt");
            try{
                 
                List<Posto> linee = loadFile(inFile);     
                // non ho capito che fai, lo sai tu, ma lascio stare 
                int i = 0,j =0;
                while(i<a.size()) {
                    if(a.get(i).fila==linee.get(j).fila && a.get(i).posto==linee.get(j).posto){
                        linee.get(j).flagDis+=1;
                        i++;
                        j++;
                    }
                    else {j++;}
                }
    
    
                writeFile(linee, out);
                
                if (!inFile.delete()) {
                    System.out.print("File Non Eliminato");
                    //qui dovresti fermarti visto che il file non eliminato non ti permette di fare rename. 
                }
    
    
    
    
                /*  CREO IL FILE DI AGGIORNAMENTO CON LA PRENOTAZIONE NUOVA */
                
                
                boolean Rinomina = out.renameTo(inFile);
                    if(!Rinomina){System.out.println("File o directory non rinominati. PRENOTAZIONE NON COMPLETATA.");}     
                }
                catch(IOException e){
                    // almeno all'inizio vedi tutto 
                    e.printStackTrace(); 
    
    
                }
            }
    
    
    
    
            private List<Posto> loadFile(File inFile) throws IOException {
    
    
                List<Posto> ret = new ArrayList<Posto>(); 
                Scanner scan = null; 
                 try{
                   
                    scan = new Scanner(inFile);
                        
                    int h=0;
                      while(scan.hasNext()){
                      //riempio l'arraylist con i dati del file
                      ret.add(new Posto(scan.next().charAt(0),scan.nextInt(),scan.nextInt()));
                      System.out.println(linee.get(h).fila+" "+linee.get(h).posto+" "+linee.get(h).flagDis);
                      h++;
                   }
                }finally{
                    if (scan != null){
                        try{
                            scan.close(); 
                        }catch(Exception e){
                            // fai quello che ti pare 
                        }
                    }
                }
                return ret; 
            }
    
    
            private void writeFile(List<Posto> linee, File out){
                 PrintStream scrivi = null; 
                try {
    
    
                    //APRO FILE DI OUTPUT
                    
                    scrivi = new PrintStream(out);
                    for(int k=0;k<linee.size();k++){
                        scrivi.println(linee.get(k).fila+" "+linee.get(k).posto+" "+linee.get(k).flagDis);
    
    
                    }
                    scrivi.flush(); // io lo faccio sempre per sicurezza
                 }finally{
                    if (scrivi != null){
                        try{
                            scrivi.close(); 
                        }catch(Exception e){
                            // fai quello che ti pare 
                        }
                    }
                }
                
            }
    ora sei sicuro che ad ogni giro il file di partenza è cancellato?
    perché guarda qui

    http://docs.oracle.com/javase/6/docs...ava.io.File%29



    public boolean renameTo(File dest)

    Renames the file denoted by this abstract pathname.Many aspects of the behavior of this method are inherently platform-dependent: The rename operation might not be able to move a file from one filesystem to another, it might not be atomic, and it might not succeed if a file with the destination abstract pathname already exists. The return value should always be checked to make sure that the rename operation was successful.

    Parameters:
    dest - The new abstract pathname for the named file
    Returns:true if and only if the renaming succeeded; false otherwise
    Throws:SecurityException - If a security manager exists and its SecurityManager.checkWrite(java.lang.String) method denies write access to either the old or new pathnames
    NullPointerException - If parameter dest is null
    Ultima modifica di valia; 23-12-2014 a 13:17
    RTFM Read That F*** Manual!!!

  8. #8
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Così com'è strutturato non va bene e ci sono diversi errori:

    1) Cerchi di eliminare 2 volte il file "inFile".
    2) Non effettui il flush delle scritture, con il rischio di perdere eventuali dati ancora bufferizzati e non scritti
    3) L'intera gestione delle eccezioni e, di conseguenza, dei try/catch non va affatto bene.
    4) In caso di eccezione non stampi lo stackTrace, ma uccidi sia l'eccezione che l'intero processo... per l'intero processo è una tua scelta, per l'eccezione consiglierei di stampare lo stackTrace, altrimenti non saprai mai per quale ragione reale il processo è morto.


    Ho cercato di dare una raddrizzata al tuo codice (non mi sono preoccupato di controllare la correttezza di letture/scritture e altri eventuali calcoli). Prova a vedere come va:

    codice:
        public void addPrenotazione(ArrayList<Posto> a) {
    
            // Dichiariamo e inizializziamo gli oggetti File
            File inFile = new File("file1.txt");
            File out = new File("file1_agg.txt");
    
            // Dichiariamo (e inizializziamo a null) gli stream
            Scanner scan = null;
            PrintStream scrivi = null;
            try {
                scan = new Scanner(inFile);
    
                //APRO FILE DI OUTPUT
                scrivi = new PrintStream(out);
    
                int h = 0;
                while (scan.hasNext()) {
                    //riempio l'arraylist con i dati del file
                    linee.add(new Posto(scan.next().charAt(0), scan.nextInt(), scan.nextInt()));
                    System.out.println(linee.get(h).fila + " " + linee.get(h).posto + " " + linee.get(h).flagDis);
                    h++;
                }
                scan.close();
    
                int i = 0, j = 0;
                while (i < a.size()) {
                    if (a.get(i).fila == linee.get(j).fila && a.get(i).posto == linee.get(j).posto) {
                        linee.get(j).flagDis += 1;
                        i++;
                        j++;
                    } else {
                        j++;
                    }
                }
    
                for (int k = 0; k < linee.size(); k++) {
                    scrivi.println(linee.get(k).fila + " " + linee.get(k).posto + " " + linee.get(k).flagDis);
                }
    
                // Se vuoi evitare di perdere la roba bufferizzata e non scritta, forza un flush!
                scrivi.flush();
    
             } catch (Exception e) {
    
                // Mai ammazzare le eccezioni!
                e.printStackTrace();
                System.exit( 1 );   // Boh... vedi tu
    
             } finally {
    
                // La chiusura degli stream va fatta nel finally!
                if (scan != null) {
                   try { scan.close(); } catch (Exception e) { }
                }
                if (scrivi != null) {
                   try { scrivi.close(); } catch (Exception e) { }
                }
    
             }
    
             // Ora i file sono disponibili e possiamo lavorarci su
             if (!inFile.delete()) {
                 System.out.print("File Non Eliminato");
             }
    
             boolean Rinomina = out.renameTo(inFile);
             if (!Rinomina) {
                 System.out.println("File o directory non rinominati. PRENOTAZIONE NON COMPLETATA.");
             }
        }
    ho risolto ordinando il codice grazie a te e a tutti

  9. #9
    Credevo di aver risolto, inizialmente andava e poi non piu...il problema è che non mi chiude i file, li considera sempre utilizzati da un processo, e di conseguenza non mi fa ne rinominare ne eliminare.. idee?

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    sei su windows vero?
    in realtà, come dice anche la documentazione, le operazioni su i file sono molto system dependent (per forza di cose).

    Poi io ho provato questa sequenza di codice:

    codice:
    package ciao;
    
    
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintStream;
    import java.util.Scanner;
    
    
    public class ciao {
    
    
        public static void main(String args[]) throws Exception {
    
    
            File filein =  new File("fileinput") ;
            Scanner stream = new Scanner(filein);
            
            while (stream.hasNext()){
                System.out.println(stream.next());
            }
            
            stream.close(); 
            
            System.err.println("qui ci arrivo");
            File fileouot =  new File("fileoutput") ;
            PrintStream streaout = new PrintStream(fileouot);
            
            for (int i = 0; i < 10 ; i++){
                streaout.println("Ciao " + i);
            }
            streaout.flush();
            streaout.close(); 
            
            
            
            System.err.println("fine scrittura");
            
            filein.delete();
            fileouot.renameTo(filein);
            
            
        }
    }
    e funziona sul mio pc windows senza problemi.

    Se il tuo problema è scrivere sul file di partenza, puoi anche fare cosi
    codice:
    package ciao;
    
    
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintStream;
    import java.util.Scanner;
    
    
    public class ciao {
    
    
        public static void main(String args[]) throws IOException {
    
    
            Scanner stream = new Scanner(new File("filein"));
            
            while (stream.hasNext()){
                System.out.println(stream.next());
            }
            
            stream.close(); 
            
            System.err.println("qui ci arrivo");
            
            PrintStream streaout = new PrintStream(new File("filein") );
            
            for (int i = 0; i < 10 ; i++){
                streaout.println("Ciao " + i);
            }
            streaout.flush();
            streaout.close(); 
            
            System.err.println("fine");
        }
    }
    usare lo stesso file da input e output, visto che da quello che vedo tu il file lo carichi e poi te ne scordi
    Ultima modifica di valia; 24-12-2014 a 09:56
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.