Servicio de Conversiones

[ps2pdf... Servicio Windows usado para la conversión de ficheros]

Fecha: 26/Abr/2004 (25/Abr/2004)
Autor: Unai Zorrilla Castro

 

.

Motivación


El hecho de crear un Servicio de Windows para manejar la conversión de ficheros, puede que no sea algo muy fácil de explicar, pero en ciertas ocasiones necesitamos realizar conversiones, como en el ejemplo ps2pdf ( de la misma manera se podrían hacer tiff2pdf doc2pdf etc..), de una manera transparente sin que afecte a la ejecución de cualquier otro proceso que estemos desarrollando. Esto se puede realizar de una manera rápida y sencilla a través de Servicios Windows y de la clase FileSystemWatcher.

Implementación

La idea es sencilla, supongamos que tenemos un directorio especial ( por  ejemplo el directorio X:\Conversor ) lo que necesitamos es que cualquier documento .ps que copiemos a ese directorio sea convertido a pdf de una manera transparente si ninguna interacción de nuestra parte. Para ello .NET dispone de una clase System.IO.FileSystemWatcher la cual 'suelta' eventos cada vez que un fichero es creado, movido o borrado de un directorio específico. Basta por lo tanto implementar los manejadores para esos eventos y nuestro sistema estará realizado.

 

Código

Con el fin de no hacer tan pesada la lectura no pongo el código del WindowsService, bastaría implementar en el método OnStart una llamada a WatcherClass.
Para llevar un seguimiento de los procesos se ha creado el evento OnMsg, debemos implementar un método en el servicio para manejarlo, en el código de ejemplo está implementado para Introducir estos 'Mensajes' en el Log de Applicacion del sistema. La implementación de la clase FileSystemWatcher es la siguiente:

public class WatcherClass()
{
    #region Delegados y Eventos 
        public delegate void WatcherHandler(string Message); 
        public event WatcherHandler OnMsg;
    #endregion
    private System.IO.FileSystemWatcher watch; 
    public WatcherClass() 
    {
         Inicializar(); 
    } 
    private void Inicializar()
     { 
        this.watch = new FileSystemWatcher(PATH,"*.ps"); 
        this.watch.Created += new FileSystemEventHandler(NewFile);
         // Si no se establece EnableReaisingEvents a true la clase no 'soltara' los eventos 
        this.watch.EnableRaisingEvents = true; 
  }
 
    private void NewFile(object sender,FileSystemEventArgs e) 
    {
        string msg = string.Empty; 
        string pdfname = string.Empty; 
        msg = string.Format(" Archivo {0} ha entrado en el directorio ",e.Name); 
        OnMsg(msg);
         pdfname = Path.GetFileName(e.FullPath); 
        pdfname = pdfname.Replace(".ps",".pdf"); 
        ACRODISTXLib.PdfDistillerClass pdf = new ACRODISTXLib.PdfDistillerClass(); 
        try { 
            pdf.FileToPDF(e.FullPath,pdfname,string.Empty);
             msg = string.Format(" Archivo {0} se ha convertido a {1}",e.Name,pdfname);
           OnMsg(msg);
       } catch { 
            msg = string.Format(" ERROR el archivo {0} no se ha convertido a {1}",e.Name,pdfname); 
          OnMsg(msg);
         } 
    }
}
 

Notas sobre la instalación

Una vez generado el proyecto basta usar la herramienta InstallUtil para instalar el servicio Windows:

InstallUtil WindowsConversor.exe

Para activar el servicio usamos.

net start WindowsConversor

Para desactivarlo:

net stop WindowsConversor:

Y para desinstalarlo

InstallUtil -U WindowsConversor.exe


ir al índice

Fichero con el código de ejemplo: unai_windowsConversor - Tamaño 20.60 KB