Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 39
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480

    Problema errore java.io.FileNotFoundException

    Ciao a tutti
    dalla mia GUI sono riuscito a creare dei file pdf che riesco ad aprire.
    Il problema è che avendo il file pdf aperto ed andando a generare un nuovo file con lo stesso nome mi da errore :
    codice:
    java.io.FileNotFoundException: C:\Users\utente\Desktop\Glasgow.pdf (Impossibile accedere al file. Il file è utilizzato da un altro processo)
    Come posso gestire questa situazione ?

    Grazie a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    In pratica mi servirebbe qualcosa che vada a verificare prima di salvare il nuovo file se esiste già un file con lo stesso nome e che mi permetta di scegliere se sovrascriverlo o meno.
    Ho già considerato la seguente opzione:
    codice:
    if (f.exists()) {
                        String msg = MessageFormat.format("The entry ''{0}'' already exists.\nDo you want to replace it?", new Object[]{f});
                        int r = JOptionPane.showConfirmDialog(null, msg, "Confirm", JOptionPane.YES_NO_OPTION);
                        if (r == JOptionPane.NO_OPTION) {
                        } else {
                            try {
    ...
    Quindi se il file esiste ma è CHIUSO..allora lo sovrascrive. Ma se il file esiste ed è APERTO ??? Come posso fare ?

    Grazie

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    99
    Quote Originariamente inviata da roquentin Visualizza il messaggio
    In pratica mi servirebbe qualcosa che vada a verificare prima di salvare il nuovo file se esiste già un file con lo stesso nome e che mi permetta di scegliere se sovrascriverlo o meno.
    Ho già considerato la seguente opzione:
    codice:
    if (f.exists()) {
                        String msg = MessageFormat.format("The entry ''{0}'' already exists.\nDo you want to replace it?", new Object[]{f});
                        int r = JOptionPane.showConfirmDialog(null, msg, "Confirm", JOptionPane.YES_NO_OPTION);
                        if (r == JOptionPane.NO_OPTION) {
                        } else {
                            try {
    ...
    Quindi se il file esiste ma è CHIUSO..allora lo sovrascrive. Ma se il file esiste ed è APERTO ??? Come posso fare ?

    Grazie
    Ciao, da quanto ne so io è impossibile agire sui file aperti, al limite puoi provare a terminare il servizio che tiene aperto il file (ad esempio hai un pdf aperto con acrobat o chi per esso e ti compare un messaggio con la richiesta se terminare l'applicazione acrobat che tiene aperto il file). Però non so aiutarti su come interagire con processi windows, anzi non so nemmeno se ciò è possibile.
    Potresti semplicemente far apparire un messaggio che chiede all'utente di chiudere l'applicazione che utilizza il pdf, e una volta chiuso e premuto OK il programma riprova

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Si ok..ma come faccio da codice a controllare se il file è aperto?
    Cioè se devo solo controllare se il file esiste allora
    codice:
    if (f.exists()){
    ..
    ma per controllare se esiste ed è aperto?

  5. #5
    L'unico modo, almeno di ulteriori aggiornamenti da java 7/8, e quello tramite un FileChannel tentare di effettuare un lock in scrittura se il lock va a buon fine allora quel file non è utilizzato da nessun altro processo se il tentativo di lock solleva un eccezione allora il file ha già un lock e questo vuol dire che vi è già un handle aperto in scrittura.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Sto provando in questo modo:
    codice:
    ....
     if (f.exists()) {
                        String msg = MessageFormat.format("The entry ''{0}'' already exists.\nDo you want to replace it?", new Object[]{f});
                        int r = JOptionPane.showConfirmDialog(null, msg, "Confirm", JOptionPane.YES_NO_OPTION);
                        if (r == JOptionPane.NO_OPTION) {
                        } else {
                            File workDir = new File(./work/);
                            File workFile = new File(workDir, f.getName());
    
                            try {
                                if (f.renameTo(workFile)) {
                                    creaFilePdf.createPdf(tabellaMesi, tabellaTermocoppia, f, pathname, latitudine, longitudine, radiazioneAnnuale, inclinazioneOttimale, azimuth, menuCondizioni);
                                } else {
                                    System.out.println("File già utilizzato");
                                }
    
                            } catch (DocumentException ex) {
                                Logger.getLogger(PVEstimation.class.getName()).log(Level.SEVERE, null, ex);
                            } catch (IOException ex) {
                                Logger.getLogger(PVEstimation.class.getName()).log(Level.SEVERE, null, ex);
                            }
    
                        }
    ...
    però in questo modo mi visualizza il messaggio anche se il file esiste ma è chiuso (non solo se è aperto)

    Come posso fare?

    p.s. ho trovato questa soluzione parziale in una vecchia discussione: http://forum.html.it/forum/showthread/t-1543694.html

  7. #7
    Se però chiedi consigli e non vuoi seguirli....
    Ti avevo già scritto come fare a testare se un file è già aperto oppure no, cioè utilizzando un FileChannel e tentando di acquisire il look, che tra l'altro è una cosa abbastanza banale da fare:
    codice:
    File file =newFile(fileName);
    FileChannel channel =newRandomAccessFile(file,"rw").getChannel();
    // Get an exclusive lock on the whole file
    FileLock lock = channel.lock();
    try{
        lock = channel.tryLock();
        // SE ARRIVO QUI VUOL DIRE CHE IL FILE NON NESSUN LOCK (NON E' APERTO IN SCRITTURA)
    }catch(OverlappingFileLockException e){
        // SE INVECE ARRIVO QUI VUOL DIRE CHE VI E' UN LOCK SUL FILE
    }finally{
        lock.release();
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Ho fatto così:
    Ultima modifica di roquentin; 24-02-2015 a 00:00

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Ho fatto così:
    codice:
                        if (f.exists()) {
    
                            String msg = MessageFormat.format("The entry ''{0}'' already exists.\nDo you want to replace it?", new Object[]{f});
                            int r = JOptionPane.showConfirmDialog(null, msg, "Confirm", JOptionPane.YES_NO_OPTION);
                            if (r == JOptionPane.NO_OPTION) {
                            } else {
                                
                                 File file = new File(f.getName());
                            FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
                            // Get an exclusive lock on the whole file
                            FileLock lock = channel.lock();
                            try {
                                lock = channel.tryLock();
                           
                                System.out.println("NON E' APERTO IN SCRITTURA");
                            } catch (OverlappingFileLockException e) {
                               
                               System.out.println("E' APERTO ");
                            } finally {
                                lock.release();
                            }
                               
    
                            }
                        } else {
    
                            creaFilePdf.createPdf(tabellaMesi, tabellaTermocoppia, f, pathname, latitudine, longitudine, radiazioneAnnuale, inclinazioneOttimale, azimuth, menuCondizioni);
    
                        }
    In questo modo se il file non esiste me lo crea. Se invece il file esiste, sia che sia chiuso che aperto mi scrive il messaggio : "E' APERTO "

    Non capisco!

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    Secondo me non ne esci.

    Puoi provarle un po' tutte, ma non sarà mai la soluzione definitiva, non ti salvi nemmeno con il rename (dato che a seconda del SO potresti persino rinominare con successo il file).

    Se non ho capito male hai una gui dove mostri il pdf, quindi una sorta di Viewer.
    Puoi sfruttare lo stato dell'istanza del pdf data dalla tua gui ed usare quella come riferimento per decidere se è possibile o meno aggiornare il file.

    Ovviamente qualche check lo fai tipo l' if exists, che è d'obbligo, x assicurarsi che nell arco temporale dell'esecuzione del tuo programma il file non sia stato vaporizzato, ma più così non puoi fare IMHO.
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

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.