1. Archivos.
1.1 Introducción.
Disponemos de dos tipos de archivos, Secuenciales y Random.
Las condiciones son las ya conocidas, pero cambia la sintaxis y las instrucciones para su uso.
Cambian los nombres, pero sigue todo igual, afortunadamente.
Aparece la posibilidad de bloqueo de los archivos para otros procesos, en lectura, o en grabación o
ambas, en el momento de la apertura.
1.2 Secuencial.
Se sigue abriendo para entrada, salida y para adición.
Las instrucciones son las mismas, cambian las instrucciones de apertura y cierre.
El ejemplo que sigue graba y lee un archivo con los meses del año.
En la declaración del Canal, se usa la función FreeFile para obtener un número de canal disponible.
Module Ejemplo
Sub main()
Dim Canal As Int16 = FreeFile()
Dim Nombre As String = "Prueba.Txt"
Dim Valor As String
Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
"Abril", "Mayo", "Junio", _
"Julio", "Agosto", "Septiembre", _
"Octubre", "Noviembre", "Diciembre"}
Console.WriteLine("Probamos grabar un archivo secuencial ")
FileOpen(Canal, Nombre, OpenMode.Output)
For Each Valor In Meses
WriteLine(Canal, Valor) ‘ con marca fin de registro
‘ sin marca Write a solas
Console.WriteLine("Grabado {0} ", Valor)
Next
' Cierre del Archivo
FileClose(Canal)
Console.WriteLine()
Console.WriteLine("Probamos a leer un archivo secuencial ")
FileOpen(Canal, Nombre, OpenMode.Input)
Do While Not EOF(Canal)
Input(Canal, Valor)
Console.WriteLine("Leído {0} ", Valor)
Loop
' Cierre del Archivo
FileClose(Canal)
End Sub
End Module
Vemos ahora el ejemplo para adición de registros, solo es necesario cambiar el parámetro de la
instrucción FileOpen, OpenMode.Output, por OpenMode.Append.
Module Ejemplo
Sub main()
Dim Canal As Int16 = FreeFile()
Dim Nombre As String = "Prueba.Txt"
Dim Valor As String
Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
"Abril", "Mayo", "Junio", _
"Julio", "Agosto", "Septiembre", _
"Octubre", "Noviembre", "Diciembre"}
1
Console.WriteLine("Probamos añadir registros al archivo secuencial ")
FileOpen(Canal, Nombre, OpenMode.Append)
For Each Valor In Meses
WriteLine(Canal, Valor)
Console.WriteLine("Grabado {0} ", Valor)
Next
' Cierre del Archivo
FileClose(Canal)
Console.WriteLine()
Console.WriteLine("Probamos a leer un archivo secuencial ")
FileOpen(Canal, Nombre, OpenMode.Input)
Do While Not EOF(Canal)
Input(Canal, Valor)
Console.WriteLine("Leído {0} ", Valor)
Loop
' Cierre del Archivo
FileClose(Canal)
End Sub
End Module
La instrucción FileOpen, como se puede ver en el ejemplo recibe tres parámetros.
El canal por el que se trabaja con el archivo.
El nombre del archivo y el modo de apertura del mismo.
La lectura es con la instrucción Input(Canal, Variable, Variable, ....)
La grabación es con la instrucción Write(Canal, Variable, Variable, ....)
Las variables han de estar en consonancia al tipo de dato grabado.
El formato de archivo obtenido es un fichero Ascii delimitado, con comillas comas.
1.3 Random.
mismos.
Las características de los archivos a la hora de grabarlos no cambian, los pasos a seguir son los
Conviene tener presente que con la instrucción FileGet, si el entorno está con el modo Option Strict On,
dará errores y hay que desactivarlo, sin embargo FilePut, funciona correctamente, esperemos que lo
soluciones pronto.
Como en el caso de los secuenciales cambian el nombre de las instrucciones, aunque al final es igual.
El primer paso es definir la estructura del registro a utilizar.
Como podemos ver en el ejemplo se define un tipo de usuario con los campos definidos como públicos y
cuando son de tipo cadena, usando delante el argumento <VbFixedString(longitud de campo)>.
En el ejemplo lo declaramos de doce, para así poder utilizar el relleno por la derecha de blancos.
El archivo generado, no tiene delimitadores de campos ni de registros, Random estándar.
Structure RegRandom
<VBFixedString(12)> Public NombreMes As String
End Structure
Este es otro ejemplo de estructura de archivo random.
Public Structure RegistroRandom
<VBFixedString(15)> Public Nom As String
<VBFixedString(15)> Public Dire As String
<VBFixedString(15)> Public Pobl As String
<VBFixedString(2)> Public Prov As String
<VBFixedString(9)> Public Tele As String
End Structure
El siguiente paso es declarar luego la variable registro que vamos a utilizar en el acceso al archivo.
2
Dim Registro As RegRandom
Y una variable en este caso Int16 para marcar la posición en el archivo.
Dim Posicion As Int16
A la apertura del archivo se le han añadido varios parámetros que no se han usado, excepto el de
longitud de registro, y además el modo de apertura se indica que es Random.
FileOpen(Canal, Nombre, OpenMode.Random, , , Len(Registro))
El siguiente paso es asignar los datos a la variable registro, rellenada con blancos por la derecha, lo
hemos hecho usando el objeto Strings con su método Lset.
Registro.NombreMes = [Strings].LSet(Valor, 12)
A continuación se incrementa el contador, sistema abreviado
Posicion += 1
Y utilizamos la instrucción FilePut para grabar, el contenido es el mismo que antes con el Put.
FilePut(Canal, Registro, Posicion)
Luego sin cerrar el archivo, inicializamos posición, o usamos el For Next, y leemos el archivo entero, y
funciona.
La lectura es con FileGet, que funciona igual que el Get.
FileGet(Canal, Registro, Posicion)
Y ahora todo el ejemplo completo.
Module Ejemplo
Structure RegRandom
<VBFixedString(12)> Public NombreMes As String
End Structure
Sub main()
Dim Registro As RegRandom
Dim Canal As Int16 = FreeFile()
Dim Nombre As String = "PruebaRandom.Txt"
Dim Posicion As Int16
Dim Valor As String
Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
"Abril", "Mayo", "Junio", _
"Julio", "Agosto", "Septiembre", _
"Octubre", "Noviembre", "Diciembre"}
Console.WriteLine("Probamos añadir registros al archivo ")
FileOpen(Canal, Nombre, OpenMode.Random, , , Len(Registro))
For Each Valor In Meses
Posicion += 1
Registro.NombreMes = [Strings].LSet(Valor, 12)
FilePut(Canal, Registro, Posicion)
Console.WriteLine("Grabado {0} ", Valor)
Next
Console.WriteLine()
Console.WriteLine("Probamos a leer el archivo ")
3
For Posicion = 1 To 12
FileGet(Canal, Registro, Posicion)
Console.WriteLine("Leído {0} ", Registro.NombreMes)
Next
' Cierre del Archivo
FileClose(Canal)
End Sub
End Module
1.4 Otras actuaciones con archivos.
Además de leer los archivos de datos, a veces hay que borrar o cambiar de nombre alguno de los
archivos, los métodos imprescindibles son los que figuran en el ejemplo.
Module Ejemplo
Structure RegRandom
<VBFixedString(12)> Public NombreMes As String
End Structure
Sub main()
Dim Registro As RegRandom
Dim Canal As Int16 = FreeFile()
Dim Nombre As String = "PruebaRandom.Txt"
Dim Posicion As Int16
FileOpen(Canal, Nombre, OpenMode.Random, , , Len(Registro))
Console.WriteLine(FileSystem.CurDir()) ' Directorio Actual
' Devuelve la fecha del archivo
Console.WriteLine(FileSystem.FileDateTime("C:\Autoexec.bat"))
' Devuelve la longitud en bytes del archivo, 144 = 12 * 12
Console.WriteLine(FileSystem.FileLen("PruebaRandom.txt"))
' Devuelve la longitud en bytes del archivo, 144 = 12 * 12
Console.WriteLine(FileSystem.LOF(Canal)) ' 144, 12 * 12
' Posición actual del puntero
Console.WriteLine(FileSystem.Loc(Canal))
' Cambia de nombre un archivo
FileSystem.Rename(Viejo, Nuevo)
' Borrado de directorio
FileSystem.RmDir(Direccion)
‘ Cierre del archivo
FileClose(Canal)
‘ Borra el archivo
FileSystem.Kill("PruebaRandom.Txt")
End Sub
End Module
Además hay más métodos disponibles.
4
1.5 Listados.
Los listados han sufrido cambios considerables.
No hacemos referencia al Crystal Report, pues en definitivas cuentas es un asistente, no muy
complicado de ver, y que los alumnos en cualquier momento se pueden mirar.
Hablamos desde el listado con los recursos disponibles en Visual Studio, con los objetos PrintDocument,
PrintPreviewDialog, ...
El principal es que el hecho de realizar un listado para que éste se obtenga por impresora o pantalla, es
indistinto, ha de realizarse en el evento PrintPage del objeto PrintDocument.
Este objeto, es el que digamos realiza la labor de impresión, facilitando el resultado del mismo al objeto
impresora o al de vista previa, que son los que se encargan de su visualización en el destino correspondiente.
El principal apartado a tener en cuenta es el sistema de cambio de página, el cual, salvo error por
nuestra parte, es ..., sin comentarios.
Lo más parecido a lo visto, es la salida por excepción del lenguaje RPG, aunque claro, nada que ver con
la misma, esa funcionaba bien, claro, tampoco con el lenguaje, ni con su diseñador.
El sistema seguido para el cambio de página es el realizar una salida del procedimiento de evento
PrintPage, indicando
Comentarios de: 1. Vb .Net 2005 - Archivos (0)
No hay comentarios