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

    [JAVA] Evento a seguito di aggiunta file in cartella

    Ciao ragazzi,
    esiste il modo di puntare una cartella e di eseguire qualcosa ( chessò per esempio anche un System.out ) nel caso in cui in tale cartella sia copiato o modificato un qualsiasi file?

    Grazie a tutti!

    Ciao!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    No: ti devi realizzare un demone che lo faccia.


    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

  3. #3
    Consigli?

    Non credo si debba fare periodicamente il controllo, sarebbe svantaggioso...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Io ho fatto proprio così: un thread che ogni 5 millisecondi controlla la directory.
    In questo modo ho realizzato un demone che monitora una directory e funziona perfettamente (è entrato in produzione ormai da quasi 4 mesi...).


    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
    Originariamente inviato da LeleFT
    Io ho fatto proprio così: un thread che ogni 5 millisecondi controlla la directory.
    In questo modo ho realizzato un demone che monitora una directory e funziona perfettamente (è entrato in produzione ormai da quasi 4 mesi...).


    Ciao.
    Alcune domande:
    -Il demone in che linguaggio l'hai scritto?
    -Lavora in modo utente o è un driver di sistema in modo kernel?
    -Hai usato JNI?

    Insomma, sempre se la cosa non ti scoccia puoi dare qualche informazione ulteriore su come hai realizzato questo progetto mi interessa. Grazie
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Originariamente inviato da LeleFT
    Io ho fatto proprio così: un thread che ogni 5 millisecondi controlla la directory.
    In questo modo ho realizzato un demone che monitora una directory e funziona perfettamente (è entrato in produzione ormai da quasi 4 mesi...).


    Ciao.
    Ma non danneggia l'hd un processo del genere?

    Potresti postare parte del codice?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    @unomichisiada:

    Tutto in Java!

    @magnus:

    Non penso proprio: del resto un server deve essere in grado di gestire letture e scritture "simultanee", concorrenti e frequenti (se penso, ad esempio, alla realtà lavorativa in cui mi trovo, dove ogni giorno una trentina di utenti utilizzano lo stesso server pesantemente con operazioni di ogni genere + qualche altro migliaio di clienti sparsi in tutta italia accedono "indirettamente" allo stesso server per il sito...)

    Non ho nessuna difficoltà a postare il codice del demone (la sua struttura, perlomeno):
    codice:
    import java.io.*;
    import java.util.Vector;
    import java.util.GregorianCalendar;
    
    public class DemoneFatture extends Thread {
    
       private boolean attivo;                // Flag: indica se il demone è attivo o no
       private int tempo;                     // Millisecondi di attesa tra un controllo e l'altro
       private long intervallo;               // Millisecondi di attesa per rispetto orario di funzionamento
       private String monitor;                // Directory da monitorare
       private File tmpDir;                   // Directory temporanea
       private String [] contenuto;           // Contenuto della directory monitor al momento del controllo
       private boolean[] lock;                // Flags di lock per il file in 'contenuto'
       private Buffer buffer;                 // Buffer per lo Spazzino
       private GregorianCalendar oraInizio;   // Ora di inizio del monitoraggio
       private GregorianCalendar oraFine;     // Ora di fine del monitoraggio
    
       private PrintStream oldOut;
       private PrintStream newOut;
    
       private Fatture fat;
    
       public DemoneFatture(Fatture fat, String monitor, String oraInizio, String oraFine, Buffer buffer) {
          tempo = 1000;   // 1 secondo di attesa
          attivo = true;
          monitor = monitor.replaceAll("\\\\", "/");
          if (monitor.charAt(monitor.length()-1) != '/')
             monitor += "/";
          this.fat = fat;
          this.monitor = monitor;
          this.oraInizio = genera( oraInizio );
          this.oraFine = genera( oraFine );
          this.buffer = buffer;
          try {
             oldOut = System.out;
             newOut = new PrintStream( new java.io.FileOutputStream("logFileFatture.log") );
             System.setOut( newOut );
             System.setErr( newOut );
          } catch (Exception e) {
             e.printStackTrace();
          }
       }
    
       public void run() {
          try {
             tmpDir = new File("./tempFat/");
             if (!tmpDir.exists()) {
                if (!tmpDir.mkdir()) {
                   System.out.println("Impossibile creare la directory temporanea!");
                   attivo = false;
                }
             }
             while( attivo ) {
                if ( controllaOrario() ) {
                   controllaDirectory();
                   sleep(tempo);
                } else {
                   System.out.println("-- Ora termine monitoraggio: " + stampaOra(new GregorianCalendar()));
                   System.out.println("-- Ora prevista ripresa monitoraggio: " + stampaOra(oraInizio));
                   sleep(intervallo);
                }
             }
          } catch (Exception e) {
             System.out.println("-- DEMONE FERMO --");
             e.printStackTrace();
          }
       }
    
       private String normalizza(int num) {
          return (num > 9) ? "" + num : "0" + num;
       }
    
       private String stampaOra(GregorianCalendar gc) {
          int ampm = gc.get(gc.AM_PM);
          int aggiunta = (ampm == gc.PM) ? 12 : 0;
          return "" + normalizza(gc.get(gc.HOUR) + aggiunta) + ":" + normalizza(gc.get(gc.MINUTE)) + ":" + normalizza(gc.get(gc.SECOND));
       }
    
       private GregorianCalendar genera(String ora) {
          int ore = Integer.parseInt( ora.substring(0, 2) );
          int minuti = Integer.parseInt( ora.substring(3, 5) );
          GregorianCalendar tmp = new GregorianCalendar();
          return new GregorianCalendar(tmp.get(tmp.YEAR), tmp.get(tmp.MONTH), tmp.get(tmp.DATE), ore, minuti);
       }
    
       private boolean controllaOrario() {
          boolean ret = false;
          GregorianCalendar gc = new GregorianCalendar();
          int ampm;
          long aggiunta = 0;
          ret = gc.before(oraFine) && gc.after(oraInizio);
          if ( !ret ) {
             ampm = gc.get(gc.AM_PM);
             if (ampm == gc.PM) aggiunta = (long) 12;
             long oreAttuali = gc.get(gc.HOUR) + aggiunta;
             long minutiAttuali = gc.get(gc.MINUTE);
             long secondiAttuali = gc.get(gc.SECOND);
             ampm = oraInizio.get(oraInizio.AM_PM);
             aggiunta = 0;
             if (ampm == oraInizio.PM) aggiunta = (long) 12;
             long oreInizio = oraInizio.get(gc.HOUR) + aggiunta;
             long minutiInizio = oraInizio.get(gc.MINUTE);
             long minutiDiff = 0;
             if ( gc.after(oraInizio) ) {
                minutiDiff = 1440 - (((oreAttuali * 60) + minutiAttuali) - ((oreInizio * 60) + minutiInizio));
             } else {
                minutiDiff = ((oreInizio * 60) + minutiInizio) - ((oreAttuali * 60) + minutiAttuali);
             }
             long secondiDiff = - secondiAttuali + 10;
             intervallo = ((minutiDiff * 60) + secondiDiff) * 1000;
          }
          fat.setStatoDemone( ret );
          return ret;
       }
    
       private void controllaDirectory() {
          String suffix = "";
          try {
             File dir = new File(monitor);
             if ( dir.exists() ) {
                contenuto = dir.list();
                lock = new boolean[contenuto.length];
                for (int j=0; j<lock.length; j++) lock[j] = !contenuto[j].endsWith(".lock");
                String fileOut = "";
                for (int i=0; i<contenuto.length; i++) {
                   if ( !contenuto[i].endsWith(".lock") ) {
                      if ( !sposta(monitor+contenuto[i], tmpDir.toString()+File.separator+contenuto[i]) ) {
                         System.out.println("Impossibile creare il file temporaneo: "+(new File(tmpDir.toString()+File.separator+contenuto[i])).toString());
                         lock[i] = false;
                      } else {
                         suffix = contenuto[i].substring(contenuto[i].length()-6, contenuto[i].length()-4);
                         contenuto[i] = tmpDir.toString()+File.separator+contenuto[i];
                         if (suffix.toUpperCase().equals("_M")) FatturePDF.generaPDF(contenuto[i], "COPIA MITTENTE");
                         if (suffix.toUpperCase().equals("_D")) FatturePDF.generaPDF(contenuto[i], "COPIA DESTINATARIO");
                         if (suffix.toUpperCase().equals("_V")) FatturePDF.generaPDF(contenuto[i], "COPIA VETTORE");
                         if (suffix.toUpperCase().equals("_C")) FatturePDF.generaPDF(contenuto[i], "COPIA CONFORME");
                      }
                   }
                }
                if (contenuto.length > 0) {
                   Vector v = new Vector();
                   for (int j=0; j<contenuto.length; j++) {
                      if (lock[j]) v.add( contenuto[j] );
                   }
                   String[] listaPassata = new String[v.size()];
                   for (int j=0; j<listaPassata.length; j++) listaPassata[j] = (String) v.elementAt(j);
                   buffer.aggiungi(listaPassata);
                }
             } else {
                System.out.println(stampaOra( new GregorianCalendar() ) + ": Directory inesistente.");
             }
          } catch (Exception e) {
             System.out.println("Errore individuato, ma ignorato:");
             e.printStackTrace();
          }
       }
    
       private boolean sposta(String src, String dst) throws Exception {
          boolean result = false;
          try {
             FileInputStream fis = new FileInputStream( src );
             FileOutputStream fos = new FileOutputStream( dst );
             byte [] buf = new byte[fis.available()];
             int letti = fis.read( buf );
             if (letti > 0) {
                fos.write( buf );
                fos.flush();
                fos.close();
                fis.close();
             }
             if ( (new File(src)).delete() ) {
                result = true;
             } else {
                (new File(dst)).delete();
             }
          } catch (IOException ioe) {
             result = false;
          }
          return result;
       }
    
       public void ferma() { attivo = false; fat.setStatoDemone( false ); }
    }
    Non posto la classe FatturePDF: prende un file e genera un PDF (oltre a fare altre cose)

    Non posto nemmeno la classe Spazzino (poco interessante): è un thread che si occupa di cancellare i temporanei quando il programma di generazione PDF ha finito di utilizzarli.


    Cosa fa: monitora una ditrectory (remota). Quando trova un file lo copia in locale e lo cancella dalla remota. Quindi lo elabora.
    Il tutto viene temporizzato: la sua creazione richiede il passaggio di un orario di inizio e un orario di fine funzionamento + un puntatore ad una finestra che riceve dei messaggi.


    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

  8. #8
    Carino, complimenti!
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    Ho notato comunque che c'è una classe microsoft per monitorare le modifiche nel filesystem.

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da magnus
    Ho notato comunque che c'è una classe microsoft per monitorare le modifiche nel filesystem.
    Che non potrebbe funzionare con me, in quanto la directory che viene monitorata risiede su un server Linux.


    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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.