텍스트파일과 바이너리파일 상관 없이 모든 파일을
오픈해서 파일의 특정위치에..다른정보를 입력하고..
다시 저장하고...다시 그정보가 확인되었으면 파일을 다시오픈해서
입력했던 정보만 삭제하고 다시 저장하는 플그램을 하고있는데요..
이것이 가능한건지요??
파일오픈해서 데이타 입력하는것은 가능할꺼 같은데...
삭제시에는 어떻게 해야되는지.좀 갈켜주심 감사하겠습니다..
텍스트나 바이너리너리 상관없이 파일을 오픈하려면 어떻게
오픈해야되는지도 좀 부탁드리겠습니다...
그럼 좋은 하루 되시구여..
꼭좀 답변 부탁드립니다...
피에스 : 게시판 여기저기 뒤져봤는데 찾지를 못하겠더라구여...
바쁘시면 검색어라도 가르쳐주심 다시 한번 찾아보겠습니다..
1. Update.
|파일---------------|(특정위치)(원래내용)|-----------|
|파일---------------|(특정위치)(바뀐내용)|-----------|
이런 상황이라면 TFileStream 하나만 쓰면 간단합니다.
TFileStream 에서 Seek를 사용하거나 혹은 Position을 사용해서 특정 위치로 파일 포인터를 옮기고 Write(WriteBuffer)를 사용하면 되죠...
2. Append.
|파일--------------|(특정위치)(원래내용)|-----------|
|파일--------------|(특정위치)----(삽입내용)---(원래내용)|-----------|
이런 경우라면... 별수 없습다...
파일을 읽기 위해서 TFileStream, 새로운 내용을 저장하기 위해서 TMemoryStream을 넣어야 겠죠...
아래 코드는 'e:test.txt'에 'abcdefghijklmnopqrstuvwxyz'가 들어 있는 상황에서, e와 f 사이에 '23456'을 추가하는 코드입니다. 간단하게 보이기 위해서 파일 검사/ 예외처리 등을 모두 삭제했습니다.
관건은 Seek 사용과 TStream.CopyFrom이죠...
procedure TForm1.Button2Click(Sender: TObject);
var
tempStream :TFileStream;
memStream :TMemoryStream;
arTemp :array [0..10] of Char;
begin
tempStream := TFileStream.Create('e:test.txt', fmOpenReadWrite);
memStream := TMemoryStream.Create;
memStream.CopyFrom(tempStream, 5);
StrPCopy(@arTemp[0], '23456');
memStream.WriteBuffer(arTemp, 5);
tempStream.Seek(soFromBeginning, 5);
memStream.CopyFrom(tempStream, tempStream.Size - 5);
memStream.Seek(soFromBeginning, 0);
tempStream.Seek(soFromBeginning, 0);
tempStream.CopyFrom(memStream, memStream.Size);
tempStream.Free;
memStream.Free;
end;
3. 삭제
|파일--------------|(특정위치)----(삽입내용)---(원래내용)|-----------|
|파일--------------|(특정위치)(원래내용)|-----------|
이렇게 바뀌어야죠?
역시 TFileStream/ TMemoryStream 사용합니다.
여기서 관건은 Seek, CopyFrom,Position, Size 입니다. 파일이 줄어드는 상황이니깐 Size 조절 있어야 하고요, 테스트 해보니 Seek(soFromCurrent, 5)가 제대로 동작하지 않아서 Position으로 사용했죠...
procedure TForm1.Button3Click(Sender: TObject);
var
tempStream :TFileStream;
memStream :TMemoryStream;
begin
tempStream := TFileStream.Create('e:test.txt', fmOpenReadWrite);
memStream := TMemoryStream.Create;
memStream.CopyFrom(tempStream, 5);
tempStream.Position := tempStream.Position + 5;
memStream.CopyFrom(tempStream, tempStream.Size - 10);
memStream.Seek(soFromBeginning, 0);
tempStream.Seek(soFromBeginning, 0);
tempStream.CopyFrom(memStream, memStream.Size);
tempStream.Size := tempStream.Size - 5;
tempStream.Free;
memStream.Free;
end;