2011-10-13 53 views
19

Necesito hacer un programa que genere una contraseña que se guarda en un formato de archivo de texto en un destino específico que configuro y el usuario necesita abrir .txt para obtener la contraseña para 'desbloquear' otro programa.Cómo guardar una cadena en un archivo .txt en Delphi?

Ya obtuve el código para generar la contraseña en la cadena sPass y ahora necesito usar la función SaveToFile para guardarla en el archivo de texto que creé, llamado Password.txt pero no encuentro la forma general para usar el SaveTo File Function en Delphi y no sé dónde colocar sPass y Password.txt en la función.

Debería ser algo como: SaveToFile (...) pero no saber cómo ahorrar spass en Password.txt

Editar:

Sólo una pregunta más, ¿cómo se elimina lo que es almacenado previamente en Password.txt antes de agregarle la cadena para que Password.txt esté en blanco antes de agregar la cadena? Gracias

Respuesta

20

La manera moderna es crear una lista de cadenas y guardarla en un archivo.

procedure MakeAStringlistAndSaveThat; 
var 
    MyText: TStringlist; 
begin 
    MyText:= TStringlist.create; 
    try 
    MyText.Add('line 1'); 
    MyText.Add('line 2'); 
    MyText.SaveToFile('c:\folder\filename.txt'); 
    finally 
    MyText.Free 
    end; {try} 
end; 

Tenga en cuenta que Delphi ya tiene una clase relacionada que hace todo lo que quiere: TInifile.
Almacena valores y claves en un formato key = 'value'.

passwordlist:= TInifile.Create; 
try 
    passwordlist.LoadFromFile('c:\folder\passwords.txt'); 
    //Add or replace a password for `user1` 
    passwordlist.WriteString('sectionname','user1','topsecretpassword'); 
    passwordlist.SaveToFile('c:\folder\passwords.txt'); 
finally 
    passwordlist.Free; 
end; {try} 

Advertencia
Tenga en cuenta que guardar contraseñas unecrypted en un archivo de texto es un valor de fugas. Es mejor cifrar sus contraseñas utilizando una función de hash, consulte: Password encryption in Delphi
Para obtener sugerencias sobre cómo guardar contraseñas de forma segura.

+0

Con "MyText.SaveToFile ('c: \ carpeta \ archivo.txt');" , No puedo usar eso ya que no puedo averiguar en qué directorio permanecerá, ya que usaré varias computadoras para probar esto y el directorio de mi unidad flash (en el que lo almacenaré) será diferente cada vez, es decir, podría ser E una vez, luego F en la otra PC, luego G en otra, etc. –

+0

Así que debe verificar la ubicación de la carpeta desde la que se inicia la aplicación. ¡Eso no debería ser demasiado difícil! – Birger

+0

'TIniFile' no es un descendiente de' TStrings'. –

13

Usted puede utilizar la clase TFileStream para guardar una cadena en un archivo:

uses 
    Classes; 

procedure StrToFile(const FileName, SourceString : string); 
var 
    Stream : TFileStream; 
begin 
    Stream:= TFileStream.Create(FileName, fmCreate); 
    try 
    Stream.WriteBuffer(Pointer(SourceString)^, Length(SourceString)); 
    finally 
    Stream.Free; 
    end; 
end; 

y leer

function FileToStr(const FileName : string):string; 
var 
    Stream : TFileStream; 
begin 
    Stream:= TFileStream.Create(FileName, fmOpenRead); 
    try 
    SetLength(Result, Stream.Size); 
    Stream.Position:=0; 
    Stream.ReadBuffer(Pointer(Result)^, Stream.Size); 
    finally 
    Stream.Free; 
    end; 
end; 
+0

Nice helper functions. –

33

La forma moderna es utilizar TFile.WriteAllText en IOUtils (Delphi 2010 y hasta)

procedimiento WriteAllText (const Path: string; const Contents: string); sobrecarga; estático;

Crea un nuevo archivo, escribe la cadena especificada en el archivo y luego cierra el archivo. Si el archivo de destino ya existe, se sobrescribe.

+0

Esto es muy interesante, no estaba al tanto de tal función. ¡Gracias! – TridenT

+0

Puede tener algunos errores ... https://stackoverflow.com/questions/35708827/what-could-cause-no-mapping-for-the-unicode-character-exists-in-the-target-mult – EMBarbosa

4

más rápido y más simple, sin necesidad de declarar las variables:

with TStringList.Create do 
try 
    Add(SomeString); 
    SaveToFile('c:\1.txt'); 
finally 
    Free; 
end; 
+0

Si el el archivo "c: \ 1.txt" no se puede escribir, obtendrá una excepción y el libre no se ejecutará, por lo que es posible que desee utilizar try finally build. –

+0

De acuerdo, se agregó ** try..finally ** block. – TPAKTOPA

+1

El uso de with agrega mucha más maldad que la falta de ganancias de vars locales. -1 – Johan

Cuestiones relacionadas