【问题标题】:How to save a string to a .txt file in Delphi?如何在 Delphi 中将字符串保存到 .txt 文件?
【发布时间】:2011-10-13 09:47:48
【问题描述】:

我需要制作一个程序来生成密码,该密码以文本文件格式保存在我设置的特定目标中,用户需要打开 .txt 以获取密码以“解锁”另一个程序。

我已经获得了在字符串 sPass 中生成密码的代码,现在我需要使用 SaveToFile 函数将其保存到我创建的名为 Password.txt 的文本文件中,但我找不到使用 SaveTo 的一般形式Delphi中的文件函数,我不知道将sPass和Password.txt放在函数中的什么位置。

它应该类似于:SaveToFile(...) 但我不知道如何将 sPass 保存在 Password.txt 中

编辑:

还有一个问题,在添加字符串之前如何删除之前存储在 Password.txt 中的内容,以便在添加字符串之前 Password.txt 为空白?谢谢

【问题讨论】:

    标签: string delphi delphi-7 text-files


    【解决方案1】:

    现代方法是创建一个字符串列表并将其保存到文件中。

    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;
    

    请注意,Delphi 已经有一个相关的类可以满足您的所有需求: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}
    

    警告
    请注意,将未加密的密码保存在文本文件中是一种安全漏洞。最好使用哈希函数对您的密码进行哈希处理,请参阅:Password encryption in Delphi
    有关如何以安全方式保存密码的提示。

    【讨论】:

    • 使用“MyText.SaveToFile('c:\folder\filename.txt');” ,我不能使用它,因为我无法找出它将保留在哪个目录中,因为我将使用多台计算机对其进行测试,并且我的闪存驱动器的目录(我将存储它)每次都会不同,即它可以一次是E,然后是另一台电脑上的F,然后是另一台电脑上的G,等等
    • 因此您必须检查启动应用程序的文件夹位置。这应该不会太难!
    • TIniFile 不是TStrings 的后代。
    • 我使用了 TStringList 方式,在找到我的程序 exe 所在的目录后,它运行良好。谢谢大家,你们总是非常乐于助人!
    • Application.ExeName 包含exe文件的路径。
    【解决方案2】:

    Modern Modern 方式是在 IOUtils(Delphi 2010 及更高版本)中使用 TFile.WriteAllText

    procedure WriteAllText(const Path: string; const Contents: string); 超载;静态的;

    创建一个新文件,将指定的字符串写入文件,然后 关闭文件。如果目标文件已经存在,则覆盖。

    【讨论】:

    【解决方案3】:

    最快最简单的方法,无需声明任何变量:

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

    【讨论】:

    • 如果文件 "c:\1.txt" 不可写,你会得到一个异常并且 free 不会执行,所以你可能要使用 try finally 构造。
    • 同意,添加了 try..finally 块。
    • 使用 with 比缺少局部变量增益更邪恶。 -1
    • 我主要将这种结构用于调试目的,在任何地方都可以快速插入代码。此外,如果它很短并且您没有在 with 块中做额外的工作,那么它没有问题。对于我也不喜欢的大块,因为它很容易导致不可预测的情况。
    【解决方案4】:

    您可以使用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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      相关资源
      最近更新 更多