martes, 5 de septiembre de 2017

Crear, leer y guardar un archivo de texto plano.

Caso: crear un archivo de texto donde se guarde el directorio o carpeta seleccionada por el usuario. Consultar dicho archivo. El método funciona tanto en GNU/Linux como en Windows.

Crear y guardar:

procedure TForm1.btnSeleccionarClick(Sender: TObject);
var
  f:TFileStream;
  s:String;
begin
  if SelectDirectoryDialog1.Execute then
  begin
    if SelectDirectoryDialog1.FileName<>'' then
      EmpresasDBDir:=SelectDirectoryDialog1.FileName;
  end
  else
  begin
    ShowMessage('No se seleccionó ningún directorio. Se utilizará el actual: '+GetCurrentDir);
    EmpresasDBDir:=GetCurrentDir;
  end;
  f:=TFileStream.Create(GetCurrentDir+PathDelim+'empredir.txt',fmCreate);
  s:=EmpresasDBDir;
  f.Write(s[1],Length(s));
  f.Free;
end;

Este evento es lanzado cuando el usuario presionar el botón seleccionar directorio. Las variables utilizadas son:

f del tipo TFileStream, s del tipo string, ambas locales;

EmpresasDBDir del tipo string, global, definida en otra unidad del proyecto.

Además se utiliza el componente SelectDirectoryDialog disponible en la paleta Dialogs de Lazarus.

Si el usuario no seleccionó ningún directorio, es decir, se escapó haciendo click en Cancelar o cerró el cuadro de diálogo, entonces, en lugar de preguntarle para qué presionó el botón si no seleccionó nada, se le informa amablemente que se utilizará el directorio actual, se le muestra el mismo mediante GetCurrenteDir y utilizando la misma función, se asigna el directorio actual a la variable global EmpresasDBDir.

Luego creamos el objeto de la clase TFileStream y le pasamos dos parámetros, el primero de ellos, el nombre del archivo y el segundo la forma mediante la cual accedemos al archivo, en este caso fmCreate que significa que creamos un nuevo archivo, entendiendo que si el archivo ya existe, lo sobrescribe. Respecto del primer parámetro, es un string, el cual formamos con el directorio actual + el delimitador + el nombre del archivo, cuya extensión puede ser otra que no sea .txt. El uso de PathDelim es lo que permite que funcione tanto en Linux como en Windows y seguramente también en MacOS que al igual que GNU/Linux está basado en UNIX, ya que el separador o delimitador entre carpeta y archivo será / o \ según el sistema operativo.

La asignación del contenido de la variable EmpresasDBDir a la variable s no es necesario, se podría prescindir de la misma y utilizar directamente EmpresasDBDir, eso queda a gusto del programador teniendo en cuenta la legibilidad del código.

f.Write(s[1], Length(s)) se guardan desde el primero s[1] al último Length(s) caracter de la cadena de caracteres s y se finaliza liberando el objeto.

Si quisiéramos que el archivo conste de varias lineas, habría que agregar #13#10 a la variable s

s:=EmpresasDBDir+#13#10;

Pero para este caso luego al leer el archivo e intentar conectar una base de datos con ese path, nos dará error, porque el Enter (#13#10) no se ve pero está ahí.

Leer el archivo:

procedure TForm1.LeoDirEmpreDB;
var
  f:TFileStream;
  s:String;
begin
  f:=TFileStream.Create(GetCurrentDir+PathDelim+'empredir.txt', fmOpenRead );
  SetLength(s,f.Size);
  f.Read(s[1],F.Size);
  EmpresasDBDir:=s;
  f.Free;
end;

Para leer el archivo, en este caso no interviene el usuario de manera directa, lo realizo mediante un procedimiento y utlizando 2 variables locales f y s y la misma variable global EmpresasDBDir.

El método es parecido al de escritura, al crear el objeto, el primer parámetro es igual y el segundo no, con fmOpenRead, como su nombre lo indica, establecemos que solamente leeremos el archivo, en otras palabras: modo lectura. Paso siguiente, se debe establece el tamaño de s mediante SetLength le asignamos la misma cantidad de caracteres que contiene el archivo, si no hacemos, no funciona. Luego se realiza la lectura con el método Read del primer s[1] al último f.Size caracter. Lo leído lo asigno a la variable global y luego libero el objeto.

Se pueden hacer más cosas mediante el uso de TFileStream, como agregar datos a un fichero existente. También hay otros métodos para la lectura y escritura de archivos. Para más información recomiendo leer los siguiente enlaces:

Delphi al límite (en el cual me basé para este artículo).

FreePascal.org (Documentación oficial).

CuPas (Otro método, Pascal sin objetos).

No hay comentarios:

Publicar un comentario