2011-10-13 154 views
19

我需要製作一個程序,用於生成一個密碼,該密碼以文本文件格式保存在我設置的特定目標中,用戶需要打開.txt以獲取密碼以「解鎖」另一個程序。如何在Delphi中將字符串保存爲.txt文件?

我已經得到了代碼在字符串sPass中生成密碼,現在我需要使用SaveToFile函數將其保存到我創建的文本文件中,名爲Password.txt,但我找不到一般形式來使用Delphi中的SaveTo File函數,我不知道把sPass和Password.txt放在函數的哪個位置。

它應該是這樣的:的SaveToFile(...),但我不知道如何保存SPASS在Password.txt

編輯:

還有一個問題,你怎麼可以不說的之前存儲在Password.txt中,然後再添加字符串,以便在添加字符串之前Password.txt爲空?謝謝

回答

20

現代的方法是創建一個字符串列表並將其保存到文件。

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; 

請注意,德爾福已經有一個相關的類,可以做你想做的一切:TInifile。
它以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} 

警告
注意,在一個文本文件保存unecrypted密碼是一個安全漏洞。最好使用散列函數對密碼進行哈希處理,請參閱:Password encryption in Delphi
有關如何以安全方式保存密碼的提示。

+0

隨着 「MyText.SaveToFile( 'C:\文件夾\ FILENAME.TXT');」 ,我不能使用它,因爲我無法找出它將保留在哪個目錄,因爲我將使用多臺計算機來測試這個目錄,我的閃存驅動器目錄(我將存儲它)每次都會不同,一次是E,然後是另一臺電腦上的F,然後是另一臺電腦上的G等等。 –

+0

所以你必須檢查應用程序啓動的文件夾位置。這應該不會太難! – Birger

+0

'TIniFile'不是'TStrings'的後代。 –

13

可以使用TFileStream類保存一個字符串到一個文件:

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; 

和閱讀

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

好幫手功能。 –

33

現代現代的方式是在IOUtils使用TFile.WriteAllText(德爾福2010及以上)

過程WriteAllText(const Path:string; const Contents:string); 過載;靜態的;

創建一個新文件,將指定的字符串寫入文件,然後 關閉該文件。如果目標文件已經存在,它將被覆蓋。

+0

這很有趣,我不知道這樣的功能。謝謝! – TridenT

+0

可能有一些錯誤... https://stackoverflow.com/questions/35708827/what-c​​ould-cause-no-mapping-for-the-unicode-character-exists-in-the-target-mult – EMBarbosa

4

最快和最簡單的方法,無需聲明任何變量:

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

如果文件「c:\ 1.txt」是不可寫的,你會得到一個異常,並且free將不會執行,所以你可能想使用try finally構造。 –

+0

同意,補充** try..finally **塊。 – TPAKTOPA

+1

使用與增加更多的邪惡比缺乏本地增值收益。 -1 – Johan

相關問題