Icono
"Guardar String en archivo y viceversa"

 



En esta sección de Código fuente en Delphi vamos a mostrar cómo podemos guardar una cadena de texto (variable tipo String) en un archivo y viceversa (pasar un archivo a un String).

Para ello, he escrito esta pequeña app de ejemplo.

Existen muchas formas distintas de conseguir esta tarea en Delphi. Aquí traigo tres métodos diferentes para intercambiar un String con un archivo en disco.

  • Un primer método clásico en el que asignamos el archivo en disco con el procedimiento assignfile, y posteriormente leemos o escribimos en el archivo con las funciones blockread y blockwrite.
  • Un segundo método en el que hacemos uso de la clase TStream ( o mejor dicho de sus clases derivadas TFileStream y TMemoryStream)
  • Y un tercer método en el que usamos la clase TStringList

Para cada una de estas tres aproximaciones a la tarea de transformar una variable String en archivo y viceversa, he creado una pareja de funciones: Str2File (String To File) y File2Str (File To String), además de crear la función CopiarFichero como una posible aplicación de estas dos funciones.

En la aplicación de ejemplo de uso de estas funciones, tenemos dos etiquetas (TLabel) en el formulario y tres botones (uno para cada una de las tres metodologías diferentes a la hora de realizar esta tarea). Al pulsar un botón, el String de TLabel1 es guardado en un archivo llamado "cosa.txt" en el disco y de forma inmediata ese archivo es pasado a String que se muestra en el Label2

En la siguiente imagen puedes ver un ejemplo de uso de esta app.

A continuación, puedes ver el código completo de la app, y si lo deseas puedes descargarlo todo (código y app) en un archivo "zip".

Unit1.pas
unit Unit1;


interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Stream: TButton;
    AssignFile: TButton;
    StringList: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure StreamClick(Sender: TObject);
    procedure AssignFileClick(Sender: TObject);
    procedure StringListClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}


function File2Str(ruta: ansistring): ansistring;
var f: file;
begin
{$I-}
  result := '';
  if not FileExists(ruta) then exit;
  assignfile(f, ruta);
  filemode := fmOpenRead;
  reset(f, 1);
  setlength(result, system.filesize(f));
  blockread(f, result[1], length(result));
  closefile(f);
{$I+}
end;


function Str2File(str, ruta: ansistring): boolean;
var f: file;
  attr: integer;
begin
{$I-}
  if fileexists(ruta) then attr := FileGetAttr(ruta) else attr := faArchive;
  FileSetAttr(ruta, faArchive);
  result := true;
  assignfile(f, ruta);
  filemode := fmOpenWrite;
  rewrite(f, 1);
  result := result and (IOResult = 0);
  if result then blockwrite(f, str[1], length(str));
  result := result and (IOResult = 0);
  close(f);
  FileSetAttr(ruta, attr);
{$I+}
end;


function CopiarFichero(fuente, destino: ansistring): boolean;
begin
  result := Str2File(File2Str(fuente), destino);
end;


procedure TForm1.AssignFileClick(Sender: TObject);
begin
  DeleteFile('cosa.txt');
  Label2.caption := '';

  Str2File(Label1.Caption, 'cosa.txt');
  Label2.Caption := File2Str('cosa.txt');

end;


//////////////////////////////////////////////////////////


function File2Str_Stream(filename: AnsiString): AnsiString;
var AFileStream: TfileStream;
begin
  AFileStream := TFileStream.Create(string(filename), fmOpenRead or fmShareDenyNone);
  try
    if AFileStream.size > 0 then begin
      SetLength(Result, AFileStream.size);
      AfileStream.Read(Result[1], AfileStream.Size)
    end
    else Result := '';

  finally
    AfileStream.Free;
  end;
end;


function Str2File_Stream(Str: AnsiString; filename: AnsiString): boolean;
var AMemoryStream: TMemoryStream;
begin
  result := false;
  AMemoryStream := TMemoryStream.Create;
  try
    AmemoryStream.Write(str[1], length(str));
    AmemoryStream.SaveToFile(string(filename));
    result := true;
  finally
    AMemoryStream.Free;
  end;
end;


function CopiarFichero_Stream(fuente, destino: ansistring): boolean;
begin
  result := Str2File_Stream(File2Str_Stream(fuente), destino);
end;

procedure TForm1.StreamClick(Sender: TObject);
begin
  DeleteFile('cosa.txt');
  Label2.caption := '';

  Str2File_Stream(Label1.Caption, 'cosa.txt');
  Label2.Caption := File2Str_Stream('cosa.txt');
end;


////////////////////////////////////////////////////////////


function File2Str_StringList(filename: AnsiString): AnsiString;
var list: TStringList;
begin
  result := '';
  list := TStringList.Create;
  try
    list.LoadFromFile(string(filename));
    result := list.Text;
  finally
    list.Free;
  end;

end;

function Str2File_StringList(Str: AnsiString; filename: AnsiString): boolean;
var list: TStringList;
begin
  result := false;
  list := TStringList.Create;
  try
    list.text := Str;
    list.SaveToFile(string(filename));
    result := true;
  finally
    list.Free;
  end;
end;

function CopiarFichero_StringList(fuente, destino: ansistring): boolean;
begin
  result := Str2File_StringList(File2Str_StringList(fuente), destino);
end;


procedure TForm1.StringListClick(Sender: TObject);
begin
  DeleteFile('cosa.txt');
  Label2.caption := '';

  Str2File_StringList(Label1.Caption, 'cosa.txt');
  Label2.Caption := File2Str_StringList('cosa.txt');

end;


/////////////////////////////////////////////////////////////////


procedure TForm1.FormCreate(Sender: TObject);
begin
  label1.caption := 'Esto es una prueba.'#13 +
    'Comprobamos que las tres'#13 +
    'aproximaciones funcionan.';
end;

end.
Puede descargar el código fuente anterior con este enlace:
codigo-fuente-str2file.zip
Puede encontrar una versión Portable de Delphi en esta dirección:
http://www.andyaska.com/?act=download&id=34&mode=detail

O puede descargar la versión gratuita Delphi Starter directamente desde su web oficial: https://www.embarcadero.com/products/delphi/starter/free-download
 
Delphi Source Code
String to File



Descargar String to File Windows 10 Compatible


logo-MecaNet
Certificado de seguridad del sitio













© Carlos Miguel Cáceres García