Trabalhar com arquivos textos no Lazarus é bem fácil. Há várias maneiras de se tratar arquivos textos, desde o velho modo do Pascal (AssignFile/Reset/Rewrite/Append/CloseFile) aos métodos (LoadFromFile/SaveToFile) dos descendentes de TStrings. Mas para trabalhar com arquivos grandes é mais eficiente usar TFileStream.
Para demonstrar o uso do TFileStream montei um pequeno exemplo no Lazarus, como mostra a imagem abaixo.
O código do projeto acima encontra-se a seguir.
Bem, o projeto acima pode não demonstrar a eficiência do TFileStream, mas mostra a simplicidade de usá-lo. Basicamente a única coisa que precisamos nos preocupar é com o LineEnding que marca o fim de cada linha de um arquivo texto. Talvez um bom exemplo seja a gravação de dados em um arquivo de log de grande tamanho. Neste caso, o código para salvar as linhas ficaria bem parecido com o método ButtonSalvarClick, do exemplo acima. A única coisa que mudaria seria a linha abaixo:
FileStreamTxt := TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareDenyWrite);
A qual seria melhor substituída pelo seguinte trecho:
if FileExistsUTF8(SaveDialog1.FileName) then begin
FileStreamTxt := TFileStream.Create(SaveDialog1.FileName, fmOpenWrite or fmShareDenyWrite);
FileStreamTxt.Position := FileStreamTxt.Size;
end else begin
FileStreamTxt := TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareDenyWrite);
end;
O trecho acima garante que o arquivo não tenha seu conteúdo anterior apagado caso o arquivo já exista no caminho indicado. Assim as linhas serão adicionadas ao arquivo, algo mais lógico para quem está gravando informações em um log que tem dias e mais dias de conteúdo previamente gravado.
Outra ressalva a fazer, no método ButtonAbrirClick, é que o comando TMemo.Lines.Add adiciona automaticamente o LineEnding, sendo necessário, neste caso, remover este da linha a ser inserida, usando o comando StringReplace. Se for tratar o arquivo diretamente no TFileStream talvez não seja necessário usar este recurso.
Esta dica deve funcionar no Windows, Linux e Mac. Mais informações em:
http://wiki.freepascal.org/File_Handling_In_Pascal
[]'s,
Ericson Benjamim.