2011-10-13 16 views
19

Tôi cần tạo một chương trình tạo mật khẩu được lưu ở định dạng tệp văn bản trong một đích cụ thể mà tôi đã đặt và người dùng cần mở .txt để lấy mật khẩu để 'mở khóa' một chương trình khác.Cách lưu chuỗi vào tệp .txt trong Delphi?

Tôi đã có mã để tạo mật khẩu trong chuỗi sPass và bây giờ tôi cần sử dụng hàm SaveToFile để lưu nó vào tệp văn bản mà tôi đã tạo được gọi là Password.txt nhưng tôi không thể tìm thấy biểu mẫu chung để sử dụng SaveTo File Chức năng trong Delphi và tôi không biết nơi để đặt sPass và Password.txt trong chức năng.

Nó phải là một cái gì đó như: SaveToFile (...) nhưng tôi không biết làm thế nào để tiết kiệm spass trong Password.txt

Edit:

Chỉ cần một câu hỏi nữa, làm thế nào để bạn xóa những gì là trước đó được lưu trữ trong Password.txt trước khi bạn thêm chuỗi vào nó để Password.txt trống trước khi chuỗi được thêm vào? Cảm ơn

Trả lời

20

Cách hiện đại là tạo danh sách chuỗi và lưu tệp đó vào tệp.

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; 

Lưu ý rằng Delphi đã có lớp liên quan làm mọi thứ bạn muốn: TInifile.
Nó lưu trữ các giá trị và khóa ở định dạng 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} 

Warning
Lưu ý rằng lưu mật khẩu unecrypted trong một textfile là một bảo mật bị rò rỉ. Tốt hơn là băm mật khẩu của bạn bằng cách sử dụng hàm băm, xem: Password encryption in Delphi
Để biết các mẹo về cách lưu mật khẩu một cách an toàn.

+0

Với "MyText.SaveToFile ('c: \ thư mục \ filename.txt');" Tôi không thể sử dụng vì tôi không thể tìm ra thư mục nào sẽ ở lại vì tôi sẽ sử dụng nhiều máy tính để kiểm tra điều này và thư mục cho flashdrive của tôi (mà tôi sẽ lưu trữ) sẽ khác nhau mỗi khi nó có thể được E một lần, sau đó F trên máy tính khác, sau đó G trên một máy tính khác vv –

+0

Vì vậy, bạn phải kiểm tra vị trí thư mục mà từ đó ứng dụng được bắt đầu. Điều đó không quá khó! – Birger

+0

'TIniFile' không phải là hậu duệ của' TStrings'. –

13

Bạn có thể sử dụng lớp TFileStream để lưu một chuỗi vào một tệp:

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; 

và đọc

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

Các hàm trợ giúp đẹp. –

33

Cách hiện đại hiện đại là sử dụng TFile.WriteAllText trong IOUtils (Delphi năm 2010 và lên)

thủ tục WriteAllText (const Path: string; const Contents: string); quá tải; tĩnh;

Tạo tệp mới, viết chuỗi được chỉ định vào tệp và sau đó đóng tệp. Nếu tệp đích đã tồn tại, nó sẽ bị ghi đè.

+0

Điều này rất thú vị, tôi đã không nhận thức được chức năng như vậy. Cám ơn! – TridenT

+0

Có thể có một số lỗi ... https://stackoverflow.com/questions/35708827/what-could-cause-no-mapping-for-the-unicode-character-exists-in-the-target-mult – EMBarbosa

4

nhanh nhất và cách đơn giản nhất, không cần phải khai báo bất kỳ biến:

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

Nếu tập tin "c: \ 1.txt" không thể ghi, bạn sẽ nhận được một ngoại lệ và miễn phí sẽ không thực thi, vì vậy bạn có thể muốn sử dụng thử cuối cùng xây dựng. –

+0

Đồng ý, được thêm ** try..finally ** block. – TPAKTOPA

+1

Việc sử dụng với thêm nhiều điều ác hơn việc thiếu các vars địa phương tăng. -1 – Johan