Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Problema accesso a file di testo

    salve a tutti, sto affrontando una problematica che secondo me è "comune" a molti, quindi prima di procedere con la mia soluzione volevo chiedere se c'era qualche alternativa più rapida ed efficente.
    attualmente uso questa classe
    codice:
    package gestioneassociatifederimprese;
    /*
     *
     * Original post:
     * http://franziale.blogspot.com/2008/1...stanza-di.html
     *
     * how to use this class
     *
     * JustOneLock ua = new JustOneLock("JustOneId"); if (ua.isAppActive()) {
     * System.out.println("Applicazione già in esecuzione. "); }else { // caso in
     * cui si tratta della prima istanza dell'applicazione
     * System.out.println("Applicazione eseguita"); }
     */
    
    import core.MetodiUtilità;
    import java.io.File;
    import java.io.RandomAccessFile;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;
    import java.nio.channels.OverlappingFileLockException;
    
    public class JustOneLock {
    
        private String appName;
        private File file;
        private FileChannel channel;
        private FileLock lock;
    
        public JustOneLock(String appName) {
            this.appName = appName;
        }
    
        public boolean isAppActive() {
            try {
                file = new File(System.getProperty("user.home"), appName + ".tmp");
                channel = new RandomAccessFile(file, "rw").getChannel();
                try {
                    lock = channel.tryLock();
                } catch (OverlappingFileLockException e) {
                    // il file è già loccato
                    closeLock();
                    return true;
                }
    
                if (lock == null) {
                    
                    closeLock();
                    return true;
                }
    
                Runtime.getRuntime().addShutdownHook(new Thread() {
                    // distrugge il lock quando la JVM viene chiusa
    
                    public void run() {
    
                        closeLock();
                        deleteFile();
                    }
                });
                return false;
            } catch (Exception e) {
                closeLock();
                return true;
            }
        }
    
        // metodo per chiudere il lock sul file
        private void closeLock() {
            try {
                lock.release();
            } catch (Exception e) {
            }
            try {
                channel.close();
            } catch (Exception e) {
            }
        }
    
        // metodo per cancellare il file di lock
        private void deleteFile() {
            try {
                file.delete();
            } catch (Exception e) {
            }
        }
    }
    per la gestione del lock su un file, per avere un accesso esclusivo in unica istanza all'eseguibile. ora il mio problema è un altro, io vorrei "rimuovere" questo accesso esclusivo trasformandolo in "possibilià di salvataggio esclusiva". cioè il primo che avvia il programma può fare tutto, chi lo avvia in seguito può solo fare la visualizzazione. Avevo pensato di risolvere ciò scrivendo su di un file una variabile boolean che mi indicasse se il file fosse già aperto, in pratica replicando il concetto di lock ma al solo scopo informativo.

    Credete che ci siano alternative valide oppure questa è la strada "migliore" da percorrere???

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Qualche tempo fa (anni), avevo postato qui sul forum un esempio di lock a mezzo Socket, che forse, oltre ad essere decisamente più compresso, soffre meno del problema: morte improvvisa del thread/istanza principale, programma bloccato fino a cancellazione manuale del file di lock.

    Fai una ricerchina tra i miei post e il thread dovrebbe ancora saltare fuori: ti resta di personalizzare la gestione al tuo caso particolare (ovvero invece di inibire il lancio di una nuova istanza, se il Socket risulta già aperto setti una variabile boolean -o altro- (che ne so, qualcosa tipo "canSave", "canRead" o come ti pare) ad indicare il livello/tipo d'accesso consentito.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    ok, ma ora ti pongo un quesito (ancora non ho fatot la ricerca)...se il mio eseguibile è su una macchina e io accedo da macchine diverse...con i socket non risolvo oppure si???447quale vm controlla il socket, quello della macchina "server" oppure il mio??? se è la mia vm allora non ho risolto e devo ritornare all'adozione della variabile nel file di testo...

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Questo era il thread originale.

    http://forum.html.it/forum/showthrea...readid=1092048

    Il problema di macchine diverse che debbano scrivere su uno stesso file esula da quell'esempio, anche perché non è previsto che vi sia un server (almeno, non è previsto esplicitamente che vi sia): la prima istanza del programma crea un ServerSocket e si mette in ascolto. Le successive istanza proveranno a creare il ServerSocket, ma trovando la porta già occupata scateneranno l'eccezione.

    Proverò a vedere se l'esempio è adattabile alle tue necessità senza scrivere un "server" o un demone per la macchina di destinazione (ovvero quella che contiene il file su cui vuoi che vi sia accesso esclusivo). Magari ce la si cava bindando il ServerSocket sull'IP della macchina di destinazione...
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    pensavo la stessa cosa ma non mi convince...cioè, se io metto il jar sul mio pc e lo avvio, poi da un computer B probo ad avviarlo, sarà la VM di B a gestire la creazione del socket e di tutte le cose, quindi non andràm ad interferire con i socket e le altre cose del mio pc.

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.