2011-10-13 102 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

相关问题