2014-10-12 4 views
1

코딩을 사용할 수있는 방법이 있습니까?Memo1.lines.savetofile ('textfile1.txt')없이 메모 행을 저장하려면 이미 texfile에있는 내용을 삭제해야합니까?Delphi에서 텍스트 파일로 저장

+0

기존 파일에 메모 데이터를 추가하고 데이터를 저장하기 전에 기존 파일의 백업을 만들거나 파일이 이미 존재하며이 경우 계속/중단하라는 메시지를 표시 하시겠습니까? – Lars

답변

4

아마도 파일에 텍스트를 추가하려고합니다.

TFile.AppendAllText(FileName, Memo1.Text); 

이것은 IOUtils 장치에서 TFile 클래스를 사용과 같이 그렇게. 사용 된 인코딩을 제어하려는 경우 인코딩 매개 변수를 전달하십시오.

+2

이 단점은 파일에 손을 대기 전에 메모 내용 전체를 메모리에 임시 문자열로 저장해야한다는 것입니다. 그리고 그 String은 파일에 사용 된 인코딩으로 변환되어야합니다. Memo에 많은 텍스트가있는 경우 많은 메모리를 낭비 할 수 있지만 (일시적 임) 천천히 실행됩니다. 그러니 조심하십시오. –

+0

@remy 나는이 성능이 좋을 것으로 기대한다. 관련된 Windows 메시지가 약간 비싸기 때문에 줄 단위 처리보다 좋습니다. 그러나 확실한 메모리 비용이 있습니다. 나는 속도가 문제가 될지 의심 스럽다. 그리고 인코딩은 무엇이든 상관없이 처리되어야합니다. 이 코드의 장점은 단순한 한 줄짜리로 매우 읽기 쉽고 간결하다는 것입니다. –

9

기존 파일을 열고 스트림 끝까지 검색 한 다음 스트림을 Memo1.Lines.SaveToStream()으로 전달하십시오. TFileStream

+0

성능면에서이 코드는'TFile.AppendAllText'와 동일하다는 것을 아는 것은 흥미로울 것입니다. 왜냐하면'TMemoStrings.SaveToStream()'은 실제로'GetTextStr'를 기반으로하는'TStrings.SaveToStream()'이기 때문입니다. 또한이 코드는 작성된대로 BOM을 방출합니다. –

+0

BOM이없는'TEncoding'을'SaveToStream()'에 제공함으로써 출력되는 BOM을 건너 뛸 수 있습니다. 예를 들어 UTF-8을 원한다면 XE 및 그 이전 버전에서'TEncoding.GetEncoding (65001)'을 사용하거나 XE2 이후 버전에서'TUTF8Encoding'에서 파생되어'GetPreamble()'을 오버라이드 할 수 있습니다. 'TMBCSEncoding' (GetEncoding()이 리턴하는)은 XE2까지 BOM을 출력하지 않았습니다. –

+0

실제로 WriteBOM 또는 유사한 TStrings 속성을 사용하는 것이 가장 간단합니다. 당신은 성과를 언급하지 않았다. 다른 답변에 성능 문제가 있음을 설명하는 댓글을 남겼습니다. 그러나이 대답의 코드는 동일한 성능 문제가 있습니다. 당신이 그 일을 처리하는 것이 공평한 것처럼 보입니다. –

관련 문제