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