domingo, noviembre 07, 2010

Abrir ficheros en Pascal. Control de errores en lecturas de ficheros.

Continuando con el programa del otro día, necesitaba obtener una lista de ficheros.
Había ejecutado el comando dir, y el resultado se guardaba en un fichero de texto.

Cuando se abre un fichero tanto en el mítico Turbo Pascal como ahora en FreePascal hay que tener en cuenta que se pueden producir múltiples errores:
  1. El fichero puede que no exista.
  2. El fichero puede existir pero igual no tenemos permiso de lectura sobre él.
  3. Errores incomprensibles como el que me ha pasado a mí. El fichero existe pero FreePascal me da un error en tiempo de ejecución. Meto la comprobación de errores y sin hacer nada más ya no se produce el error.
  4. Otros errores.
La comprobación de errores se hace de esta forma:
{$I-}      // directiva del compilador para deshabilitar control de errores.
reset(varFichero);
{$I+} // directiva para habilitar el control de errores.
if IOResult = 0 then
//ejecución si no se ha producido ningún error.

El programa se queda así de momento:


 1 program aztertu;
2 uses
3 Dos;
4 var
5 shell : string;
6 listaFicheros: array[1..1000] of string;
7 fichListaFicheros: text;
8 numFicheros: integer;
9 i:integer;
10
11 procedure buscarFicheros(var listaFichero: array of string; var numFicheros: integer);
12 var
13 nombreFichero: string;
14 i:integer;
15 begin
16 assign(fichListaFicheros, 'ficheros');
17 {$i-}
18 reset(fichListaFicheros);
19 {$i+}
20 if IOResult=0 then
21 begin
22 i:=1;
23 while not eof(fichListaFicheros) do
24 begin
25 readln(fichListaFicheros,nombreFichero);
26 listaFicheros[i]:=nombreFichero;
27 i:=i+1
28 end;
29 numFicheros:=i-1;
30 end
31 else
32 writeln('No he podido escribir en este directorio');
33 end;
34
35 procedure tratarFichero(var nombre:string);
36 begin
37 writeln(nombre);
38 end;
39
40 begin
41 shell:=GetEnv('COMSPEC');
42 Exec(shell, '/C dir > ficheros');
43 buscarFicheros(listaFicheros,numFicheros);
44 writeln('LISTA DE FICHEROS:');
45 writeln('------------------');
46 for i:=1 to numFicheros do
47 tratarFichero(listaFicheros[i]);
48 end.
49

De momento el programa no hace nada. Sólo muestra la lista de ficheros:



Saludos.

No hay comentarios: