Grabar CD Fecha: 06/Nov/2004 (5-11-2004)
|
Se trata de un sencillo ejemplo de como usar la Nero Type Library , para grabar en un CD (nuevo) los archivos y carpetas que queramos.
La Nero Type Library nos ofrece una gran potencia y versatilidad en todo lo referente al tostado de cds (grabar pistas de audio , multisesión , overburn , etc ...).
Este ejemplillo , (que pretende ser una simple introducción a estas posiblidades que nos brinda la libreria de Nero) , surgio como una necesidad de implementar una sencilla aplicación que me grabara un directorio y sus correspondientes subdirectorios a un cd , usando la linea de comandos con dos parámetros (directorio inicial , etiqueta del cd) , pero realmente se podría diseñar una aplicación cuyo interfaz tuviera todo lujo de detalles.Necesitamos abrir un nuevo proyecto EXE al que llamaremos GrabaCD por ejemplo con un sencillo formulario que conste de una etiqueta , la cual tendrá el nombre de LblProgreso.
A continuación sigue el código en Visual Basic que el formulario contiene , tan solo teneis que hacer copia-pega y compilará (os lo aseguro).
Una vez compilado tendreis que invocar desde la linea de comandos el archivo exe generado con dos argumentos ; la ruta del directorio a partir del cual quereis grabar todo lo que contenga en un cd y la etiqueta de volumen de ese CD : C:\ruta donde tengais el ejecutable>GrabaCD.exe C:\Documents and Settings BackUpCDoc (se usa como un programa de linea de comandos normal) y si los argumentos son correctos os aparecera el formulario con la etiqueta mostrandoos el progreso de grabación , por último se abrirá la bandeja de la grabadora y os saldrá un mensaje.
No os olvideis de meter un CD virgen antes de ejecutar la aplicación , si no lo haceis se abrirá la bandeja invitandoos a meter el CD :-).'Se declaran las variables del formulario , públicas a todas las funciones y procedimientos Dim FSOImagen As FileSystemObject Dim WithEvents MiNero As Nero Dim PistaISONero As NeroISOTrack Dim Dispositivos As INeroDrives Dim WithEvents Grabadora As NeroDrive Private Sub Form_Initialize() Set FSOImagen = New FileSystemObject Set MiNero = New Nero Set PistaISONero = New NeroISOTrack Set Dispositivos = MiNero.GetDrives(NERO_MEDIA_CD) 'Aqui se establece la unidad correcta (la grabadora de CDs en mi caso es la 1) 'Podeis averiguar que dispositivo es la grabadora mirando en las propiedades de Dispositivos. 'Dispositivos(numDispositivo).DeviceName por ejemplo sería una buena pista. Set Grabadora = Dispositivos(1) Call RealizarGrabacion End Sub 'Cuando se descargue el formulario, al terminar la aplicación destruiremos los objetos creados 'globalmente. Private Sub Form_Terminate() Set Grabadora = Nothing Set Dispositivos = Nothing Set PistaISONero = Nothing Set MiNero = Nothing Set FSOImagen = Nothing End Sub Private Sub RealizarGrabacion() Dim NombreDirectorioRaiz As String Dim EtiquetaCD As String Call InterpretarArgumentos(NombreDirectorioRaiz, EtiquetaCD) Call CrearImagenCD(NombreDirectorioRaiz, EtiquetaCD) Call GrabarImagenCD Unload Me End Sub 'Este procedimiento interpreta los argumentos que se pasan al ejecutar el programa desde la 'línea de argumentos y guarda dichos argumentos (solo necesitamos uno o dos) en las variables 'que le pasamos como parámetros por referencia. Private Sub InterpretarArgumentos(ByRef RutaDirectorioOrigen As String ,ByRef EtiquetaCD As String) Dim ArrayArgumentos() As String If Command$ = "" Then MsgBox "No se han pasado argumentos al programa" Else 'La instruccion Split es una maravilla. ArrayArgumentos = Split(Command$, " ") RutaDirectorioOrigen = ArrayArgumentos(0) EtiquetaCD = ArrayArgumentos(1) 'El segundo argumento es opcional , en caso de que no se pase se utiliza por ejemplo la fecha 'como etiqueta de volumen. If EtiquetaCD = "" Then EtiquetaCD = Date End If End If End Sub 'Este procedimiento crea la "imagen" del CD a partir de los archivos y subdirectorios que 'cuelgan del directorio inicial que le especifiquemos 'Con lo cual todos los archivos y subdirectorios de ese directorio origen que está en el disco 'duro o en otro dispositivo de almacenamiento se grabaran a partir del directorio raiz del cd. Public Sub CrearImagenCD(ByVal RutaDirectorioOrigen As String , ByVal EtiquetaCD As String) Dim Archivo As File Dim DirectorioOrigen As Folder Dim SubDirectorio As Folder Dim ArchivoNero As NeroFile Dim DirectorioRaizNero As NeroFolder If RutaDirectorioOrigen <> "" Then Set DirectorioOrigen = FSOImagen.GetFolder(RutaDirectorioOrigen) 'Se crea primero el directorio raiz del CD. Set DirectorioRaizNero = New NeroFolder 'He preferido añadir primero los archivos a la imagen del cd y luego ir uno a uno añadiendo los 'directorios que directamente cuelgan del directorio origen o inicial. 'La razón de todo esto es por seguir un orden y para realizar en un futuro un control sobre el 'tamaño de todo lo que se quiere ir metiendo en el CD , asi se sumarian los tamaños de los 'archivos y directorios que vayamos añadiendo , teniendo cuidado de no sorepasar la capacidad del CD. 'Una vez creado el directorio raiz del CD se le añaden primero los archivos. For Each Archivo In DirectorioOrigen.Files Set ArchivoNero = New NeroFile ArchivoNero.Name = Archivo.Name ArchivoNero.SourceFilePath = Archivo.Path DirectorioRaizNero.Files.Add ArchivoNero Next Archivo 'Se añaden despues todos los directorios que cuelgan del directorio raiz del cd 'con sus respectivos subdirectorios al nero folder , mediante una llamada a AñadirDirectorio 'Añadir directorio de forma recursiva ira añadiendo los subdirectorios de los directorios que 'cuelgan directamente del directorio origen o inicial For Each SubDirectorio In DirectorioOrigen.SubFolders DirectorioRaizNero.Folders.Add AnadirDirectorio(SubDirectorio) Next SubDirectorio 'Se establecen los valores para la Pista ISO del CD PistaISONero.Name = EtiquetaCD PistaISONero.RootFolder = DirectorioRaizNero PistaISONero.BurnOptions = NERO_BURN_OPTION_CREATE_ISO_FS + NERO_BURN_OPTION_RELAX_JOLIET Else MsgBox "No se ha especificado una ruta válida para el directorio origen", vbInformation End If End Sub 'Esta funcion devuelve un Directorio NeroFolder. Esto hace fácil añadir el arbol de 'directorioscompleto a un Directorio NeroFolder existente. Public Function AnadirDirectorio(ByVal Dir As Folder) As NeroFolder Dim Archivo As File Dim Directorio As Folder Dim ArchivoNero As NeroFile Dim DirectorioNero As NeroFolder 'Se crea un nuevo Directorio NeroFolder y se renombra. Set DirectorioNero = New NeroFolder DirectorioNero.Name = Dir.Name 'Se añaden todos los archivos al directorio nero folder For Each Archivo In Dir.Files Set ArchivoNero = New NeroFile ArchivoNero.Name = Archivo.Name ArchivoNero.SourceFilePath = Archivo.Path DirectorioNero.Files.Add ArchivoNero Next 'Se añaden todos los directorios al nero folder , mediante llamadas recursivas For Each Directorio In Dir.SubFolders DirectorioNero.Folders.Add AnadirDirectorio(Directorio) Next 'Se devuelve finalmente este directorio. Set AnadirDirectorio = DirectorioNero End Function 'Este procedimiento es el que finalmente graba el CD. Private Sub GrabarImagenCD() 'Se graba el CD utilizando la pista generada por el procedimiento CrearImagenCD. 'Se especifican las opciones correspondientes a lo que queremos hacer , un CD de datos. Grabadora.BurnIsoAudioCD "Artista", "Titulo", 0, PistaISONero, Nothing, Nothing, NERO_BURN_FLAG_WRITE, 16, NERO_MEDIA_CD End Sub 'Por ultimo , implementamos los manejadores de dos de los eventos de la grabadora. Private Sub Grabadora_OnProgress(ProgressInPercent As Long, Abort As Boolean) Me.LblProgreso.Caption = ProgressInPercent & "%" End Sub Private Sub Grabadora_OnDoneBurn(StatusCode As NEROLib.NERO_BURN_ERROR) MsgBox "CD Grabado", vbInformation End SubEste programa se basa en la utilización del Scripting Runtime y cómo no en la libreria de Nero ; por lo tanto hay que hacer referencia en el proyecto a dos librerias de enlace dinámico ; (En el menu Proyecto/Referencias) hay que seleccionar Microsoft scripting Runtime y Nero Type Library.
Importante:La librería en cuestión (Nero Type Library - NeroCom.dll) , cuya versión 1.0 viene con la versión 5 de Nero y la 1.3 viene con la versión 6 , funcionará solo si se tiene instalada la correspondiente versión de Nero.
Una versión reducida (Nero express) está disponible en la web de Nero y permite el uso de la librería NeroCom.dll , con lo cual no creo que haya ningún problema en desarrollar programas basados en esta tecnología para uso personal.Para uso comercial habría que adquirir la licencia de Nero.
Para simplificar el código no se ha hecho ningún tipo de comprobación ni tratamiento de errores.
Aunque su funcionamiento es sencillo y eficaz si no ocurre ningún problema , no está de más hacer comprovaciones del tamaño de los archivos y directorios que queremos incluir o implementar como funciones que devuelven boolean (true si todo ha ido bien) los procedimientos CrearImagenCD y GrabarImagenCD.Se ha utilizado un pequeño formulario y los eventos del objeto grabadora OnProgress (para ir mostrando el progreso de alguna manera) y OnDoneBurn para también de alguna manera avisar cuando se ha acabado de grabar , aunque de manera automática se abre la bandeja de la grabadora.
Hay que recalcar que el proceso de grabación se ejecuta en un hilo aparte , con lo cual mientras la libreria graba la imagen del cd , se continuaría ejecutando otras posibles instrucciones del programa.
Si investigais los eventos de los objetos Grabadora y MiNero junto con la gran cantidad de propiedades de los dispositivos y opciones de grabación os podreis hacer una idea de la funcionalidad que tiene la librería.