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.
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".
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.