|
파일을 접근 하는 방법은 여러가지가 있습니다. 순수 C++이면 쓰시던거 그대로 쓰시고
빌더를 사용 하신다면 VCL이 편리 하죠. VCL을 이용 할 수 있는 방법들... 예시...
TFileStream을 이용하는 방법, TStringList를 이용하는 방법, 뭐 AnsiString을 이용 할 수도 있겠구요.
한두어가지 쓰던 소스를 올려 놓겠습니다. 참고로 성능은 TFileStream이 낫겠죠.
// TStringList를 이용하는 방법
// 사용하기가 젤 간편하긴 하죠. 하지만 파일이 커지면 전체 파일을 전체 액세스 해야 하기
// 때문에 성능이 저하 됩니다. 짧은 텍스트 파일 처리 때 편리.
// TStringList에서 로딩 된 텍스트는 TStringList의 "Text"프로퍼티에 AnsiString 형태로
// 쓰기 좋게 들어 있답니다. ^^;
try
{
// 처리 루틴 ....
}
catch ( Exception &exception )
{
// 에러가 발생하면 에러 로그에 저장
AnsiString Path = ExtractFilePath( Application->ExeName );
TStringList *Log = new TStringList;
if ( FileExists( Path + "error.log" ) )
Log->LoadFromFile( Path + "error.log" );
Log->Add( Now().DateTimeString() + "(메인소켓): " + exception.Message );
Log->SaveToFile( Path + "error.log" );
delete Log;
}
//=========================================
// 아래 소스는 소켓 스레드블럭킹에서 쓰던 소스중의 일부 인데
// TFileStream을 이용해서 파일을 전송 하던 소스중의 일부 입니다.
// 자세한 도움말은 빌더에서 제공 하는 것과
// 여기 게시판에서 검색 하시면 여러가지 있을겁니다.
TWinSocketStream *pStream = new TWinSocketStream(ClientSocket, CLIENTWAITTIME);
TFileStream* SendFile = new TFileStream( fName, fmOpenReadWrite | fmShareDenyNone );
if ( SendFile->Size > -1 )
{
SendFile->Position = 0;
char *buff = new char[ 1024 ];
memset( buff, 0, sizeof(buff) );
int buff_size = 1024;
int endi = SendFile->Size / 1024;
int modi = SendFile->Size % 1024;
endi++;
if ( modi > 0 )
endi++;
for (int i= 0; i < endi; i++ )
{
SendFile->Position = i * 1024;
buff_size = SendFile->Read( buff, 1024 );
pStream->Write( buff, buff_size);
Application->ProcessMessages();
if ( ( ClientSocket->Connected == false )||( buff_size < 1024 ) )
break;
}
delete buff;
}
delete SendFile;
// 도움 되시길....
지후 님이 쓰신 글 :
: C++로 소스를 짯는데요...
: 파일을 임의로 접근을 해야하는데..
: 책에는 2진코드로된 파일만이 임의접근 방법 밖에 나와있지 않아서요
: 그냥 텍스트 문서는 임으로 접근을 할수 있는 방법이 없는건지..
: 있으면 좀 가리켜 주세요 책을 아무리 뒤져도 안나오네요
: 있는데 못찾는 건지도 모르겠지만... 하루종일 뒤졌는데..ㅡㅡ;;
: 안나오니..ㅜㅜ; 방법줌 가리켜 주세요...
|