2011-10-13 61 views
19

設定した特定の宛先にテキストファイル形式で保存されたパスワードを生成するプログラムを作成する必要があります。ユーザーが.txtを開いて別のプログラムのロックを解除するパスワードを取得する必要があります。Delphiで文字列を.txtファイルに保存する方法は?

私はすでにsPassという文字列でパスワードを生成するコードを手に入れましたが、今作成したテキストファイルにSaveToFile関数を使用してPassword.txtという名前のファイルを保存する必要がありますが、 SaveTo File Delphiの関数と私は関数にsPassとPassword.txtをどこに置くべきかわかりません。

それはのようなものである必要があります。編集

SaveToFileメソッド(...)しかし、私はPASSWORD.TXT

でSPASSを保存する方法がわからない:

もう一つだけ質問、どのようにあなたが何であるかを削除します以前に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; 

Delphiには、既に必要なものすべてを実行する関連クラスがあります。TInifile。
値とキーをkey = 'value'形式で格納します。テキストファイルにunecryptedパスワードを保存すると、セキュリティ・リークであることを
注意を警告

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
パスワードを安全に保存する方法については、ヒントを参照してください。

+0

を "MyText.SaveToFile( 'C:\フォルダ\ファイル名.txt');"私はこれをテストするために複数のコンピュータを使用し、私のflashdriveのディレクトリ(私はそれを格納するでしょう)が毎回異なっているように、どのディレクトリに残るかを見つけることはできません。 Eを1回、次にFをもう1つのPCに、次にGを別の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内容:文字列); 過負荷。静的;

新しいファイルを作成し、指定された文字列をファイルに書き込み、次に がファイルを閉じます。ターゲットファイルがすでに存在する場合は上書きされます。

+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"は書き込み可能ではないため、例外が発生し、フリーは実行されません。したがって、try finally構造を使用することをお勧めします。 –

+0

同意します。** try..finally **ブロックを追加しました。 – TPAKTOPA

+1

との併用は、ローカルバールの利益の欠如よりもはるかに悪いものを加えます。 -1 – Johan

関連する問題