2011-10-13 26 views
19

Ho bisogno di creare un programma che generi una password che viene salvata in un formato di file di testo in una specifica destinazione che ho impostato e l'utente deve aprire il .txt per ottenere la password per "sbloccare" un altro programma.Come salvare una stringa in un file .txt in Delphi?

Ho già ottenuto il codice per generare la password nella stringa sPass e ora ho bisogno di utilizzare la funzione SaveToFile per salvarlo nel file di testo che ho creato chiamato Password.txt ma non riesco a trovare il modulo generale per utilizzare il SaveTo File Function in Delphi e non so dove mettere lo sPass e Password.txt nella funzione.

Dovrebbe essere qualcosa di simile: SaveToFile (...), ma non so come salvare Spass in Password.txt

Edit:

Ancora una domanda, come si fa a cancellare ciò che è precedentemente memorizzato in Password.txt prima di aggiungere la stringa in modo che Password.txt sia vuoto prima che la stringa venga aggiunta? Grazie

risposta

20

Il modo moderno consiste nel creare una lista di stringhe e salvarla in un file.

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; 

Si noti che Delphi ha già una classe correlata che fa tutto ciò che si desidera: TInifile.
Memorizza valori e chiavi in ​​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} 

Attenzione
Si noti che il salvataggio delle password unecrypted in un file di testo è un titolo di perdite. È meglio hash le tue password utilizzando un hash, vedi: Password encryption in Delphi
Per suggerimenti su come salvare le password in modo sicuro.

+0

Con "MyText.SaveToFile ('cartella c: \ \ filename.txt');" , Non posso usarlo visto che non riesco a trovare la directory in cui rimarrà, poiché userò più computer per testarlo e la directory per la mia flashdrive (su cui la conserverò) sarà diversa ogni volta, cioè potrebbe essere E una volta, poi F sull'altro pc, poi G su un altro ecc. –

+0

Quindi è necessario controllare il percorso della cartella da cui è stata avviata l'applicazione. Questo non dovrebbe essere troppo difficile! – Birger

+0

'TIniFile' non è un discendente di' TStrings'. –

13

È possibile utilizzare la classe TFileStream per salvare una stringa in un file:

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; 

e leggere

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

Belle funzioni di supporto. –

33

Il modo più moderna è quello di utilizzare TFile.WriteAllText in IOUtils (Delphi 2010 e fino)

, procedura WriteAllText (const Percorso: stringa; const Contenuto: stringa); sovraccarico; statico;

Crea un nuovo file, scrive la stringa specificata nel file e quindi chiude il file. Se il file di destinazione esiste già, viene sovrascritto.

+0

Questo è molto interessante, non ero a conoscenza di tale funzione. Grazie! – TridenT

+0

Potrebbe avere alcuni bug ... https://stackoverflow.com/questions/35708827/what-could-cause-no-mapping-for-the-unicode-character-exists-in-the-target-mult – EMBarbosa

4

più veloce e più semplice, non c'è bisogno di dichiarare le variabili:

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

Se il il file "c: \ 1.txt" non è scrivibile, si otterrà un'eccezione e il libero non verrà eseguito, quindi potreste voler usare try finally construct. –

+0

Accetto, aggiunto ** try..finally ** block. – TPAKTOPA

+1

L'uso di con aggiunge molto più male della mancanza di guadagni di vars locali. -1 – Johan

Problemi correlati