2011-10-13 9 views
19

설정 한 특정 대상에서 텍스트 파일 형식으로 저장된 암호를 생성하는 프로그램을 만들어야하고 사용자가 .txt 파일을 열어 암호를 가져 와서 다른 프로그램을 잠금 해제해야합니다.Delphi에서 문자열을 .txt 파일로 저장하는 방법은 무엇입니까?

문자열 sPass에서 암호를 생성하는 코드가 이미 있는데 이제는 SaveToFile 함수를 사용하여 Password.txt라는 텍스트 파일에 저장해야하지만 일반 형식을 사용할 수는 없습니다. SaveTo File 함수 델파이와 나는 함수에 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; 

참고 : 따라서, 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} 

TEXTFILE에 unecrypted 암호를 저장하는 보안 누설이라고
주의 경고. 해시 함수를 사용하여 비밀번호를 해싱하는 것이 더 좋습니다. Password encryption in Delphi
안전한 방법으로 비밀번호를 저장하는 방법에 대한 도움말을 참조하십시오. (

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

을 "MyText.SaveToFile ('C : \ 폴더 \ 파일 이름 .txt');" , 나는 그것을 사용할 수 없다. 왜냐하면 나는 여러 개의 컴퓨터를 사용하여 이것을 테스트하고 나의 flashdrive (나는 그것을 저장할 것임)를위한 디렉토리를 매번 다른 때마다 사용할 수 있기 때문에 어느 디렉토리에 머무를 지 알 수 없다. E를 한 번 누른 다음 다른 PC의 F를 누른 다음 다른 G의 G를 누릅니다. –

+0

그래서 응용 프로그램이 시작된 폴더 위치를 확인해야합니다. 너무 어렵지 않아야합니다! – Birger

+0

'TIniFile'은'TStrings'의 자손이 아닙니다. –

13

당신은 파일에 문자열을 저장하기 위해 TFileStream 클래스를 사용할 수 있습니다)

프로 시저 WriteAllText (const Path : string; const 내용 : 문자열); 과부하; 공전;

새 파일을 만들고 지정된 문자열을 파일에 쓴 다음 파일을 닫습니다. 대상 파일이 이미 있으면 덮어 씁니다.

+0

좋은 헬퍼 기능. –

33

현대 현대 방법은 IOUtils에 TFile.WriteAllText을 사용하는 것입니다 델파이 2010 년까지를 읽어

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; 

과 :

+0

이것은 매우 흥미 롭습니다. 그런 기능을 알지 못했습니다. 고마워! – TridenT

+0

버그가있을 수 있습니다 ... https://stackoverflow.com/questions/35708827/what-could-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

와 함께 사용하면 로컬 바 (local vars)가 부족한 것보다 훨씬 많은 악마가 추가됩니다. -1 – Johan

관련 문제