Grabar CD
(Usando Nero Type Library)

Fecha: 06/Nov/2004 (5-11-2004)
Autor: David Fernández Contreras ; daveon@terra.es

 


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 Sub


Este 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.

 


ir al índice