Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[179] 팁! 파일이름 관련 VCL 함수들
박지훈.임프 [] 18119 읽음    1999-06-04 00:00
임프랍니다..
오늘의 팁은 파일이름 관련 vcl함수들입니다. vcl 이 클래스 라이브러리이긴 하지만,
특정 클래스에 속하지 않은 전역 함수들도 많이 있는데, 바로 이 함수들이 거기에 속합니다.
유용한 관련 함수가 많이 있죠. 자아.. 그럼 보시죠..
(알아보기 쉽게 PACKAGE라든가, __fastcall이라든가, const, 이딴건 다 뺐습니다.)

주어진 FileName의 확장자를 특정 확장자로 바꾸려면 ChangeFileExt()을 쓰면 됩니다.
function ChangeFileExt(const FileName, Extension: string): string;    // 델파이
AnsiString ChangeFileExt(AnsiString FileName, AnsiString Extension);    // C++

다음 함수들은 주어진 패스로부터 드라이브, 디렉토리 패스, 혹은 파일네임등을 분리해줍니다.
// 델파이
function ExtractFileDir(const FileName: string): string;
function ExtractFileDrive(const FileName: string): string;
function ExtractFileName(const FileName: string): string;
function ExtractFilePath(const FileName: string): string;
// C++
AnsiString ExtractFileDir(AnsiString FileName);
AnsiString ExtractFileDrive(AnsiString FileName);
AnsiString ExtractFileName(AnsiString FileName);
AnsiString ExtractFilePath(AnsiString FileName);

다음 함수는 주어진 절대 패스를 특정 패스로부터의 상대 패스로 리턴해줍니다.
function ExtractRelativePath(const BaseName, DestName: string): string;  // 델파이
AnsiString ExtractRelativePath(AnsiString BaseName, AnsiString DestName);  // C++
예를 들면,
ExtractRelativePath('C:\Program Files\qqq\', 'C:\Program Files\WinZip\Winzip.exe');  // 델파이
ExtractRelativePath("C:\\Program Files\\qqq\", "C:\\Program Files\\WinZip\\Winzip.exe");  // C++
이렇게 넘겨줬다면, 리턴되는 값은 "..\WinZip\Winzip.exe"입니다.

긴파일이름으로 되어있는 패스를 짧은 이름의 패스(8.3포맷)로 바꾸려면 ExtractShortPathName() 을 씁니다.
function ExtractShortPathName(const FileName: string): string;  // 델파이
AnsiString ExtractShortPathName(AnsiString FileName);  // C++

다음 함수는 정말 멋진 함수입니다. 뭐냐면, 주어진 패스가 화면상에서 적정 최대값 이내의 길이로 나오도록
나머지 부분을 ...(생략기호)로 처리해줍니다. 당연히 현재 설정된 폰트 등에 대한 정보가 필요하므로 캔바스를
같이 넘깁니다.
function MinimizeName(const Filename: TFileName; Canvas: TCanvas; MaxLen: Integer): TFileName;  // 델파이
AnsiString MinimizeName(AnsiString Filename, TCanvas * Canvas, int MaxLen);  // C++
예를 들어, 폼 표면에 출력할 글자인데 길이를 픽셀단위로 100 이내로 줄이려면,
MinimizeName("C:\\Program Files\\WinZip\\Winzip.exe", this->Canvas, 100);  // 델파이
MinimizeName('C:\Program Files\WinZip\Winzip.exe', self.Canvas, 100);  // C++
이렇게 하면 되죠.

다음의 두 함수는 드라이브나 디렉토리 부분이 없는 파일네임만으로부터 전체의 경로를 얻어내는 함수입니다.
두함수가 약간 다른데.. 일단 봅시다.
// 델파이
function ExpandFileName(const FileName: string): string;
procedure ProcessPath(const EditText: string; var Drive: Char; var DirPart: string; var FilePart: string);
// C++
AnsiString ExpandFileName(AnsiString FileName);
void ProcessPath(AnsiString EditText, char &Drive, AnsiString &DirPart, AnsiString &FilePart);
ExpandFileName()는 주어진 파일네임에 현재 패스를 갖다붙입니다. 이와는 대조적으로 ProcessPath()는
이미 주어진 드라이브, 디렉토리패스, 파일이름을 조합해서 전체 경로를 만들어내죠.

캬하~~~ 다음 함수는 정말 멋진 함수입니다. 사실 이 함수 하나만으로도 오늘의 팁은 충분할 정도지요.
정말 유용합니다. 뭐냐고요? ^^
주어진 파일네임이 특정 조건에 맞는지를 검사하는 함수입니다. 일단 프로토타입을 봅시다.
function MatchesMask(const Filename, Mask: string): Boolean;  // 델파이
bool MatchesMask(AnsiString Filename, AnsiString Mask);  // C++
설명을 하자면 넘 길어지고.. 예를 들어봅시다.

먼저 폼에 에디트 컨트롤을 두개 놓습니다. 그리고 Edit1의 Text 속성은 다음과 같이 합니다.
[a-s][1-3][k,v,f]*.*
두번째 에디트의 Text는 "b2v.qq" 이렇게 놓읍시다.
그런후, 버튼을 하나 놓고, 그 OnClick 이벤트 핸들러를 작성합시다.
// 델파이
procedure TForm1.Button1Click(Sender: TObject)
begin
  if MatchesMask(Edit2.Text, Edit1.Text) then Caption := 'OK'
  else                                        Caption := 'No!';
end;

// C++
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Caption = MatchesMask(Edit2->Text, Edit1->Text) ? "OK" : "No!";
}

이 결과는 폼의 캡션이 OK 로 바뀝니다.
그럼 이제 실행중에 두개의 에디트의 텍스트를 여러가지로 바꿔봅시다.

여기서 쓰이는 마스크는 좀 특이합니다. * 나 ? 기호는 도스에서부터 쓰이던 와일드카드 문자니까 금방 알아보시겠지만..
[a-s]와 같은 것은 좀 설명이 필요하겠네요. 이 [ 와 ] 로 싸인 부분은 하나의 글자를 대표합니다.
(사실 이 기호는 델파이의 셋에서 빌려온 거죠.) 그러니까, [a-s]는 주어진 위치의 글자가 a에서 s 사이의 글자이면
결과는 true가 됩니다. 그리고 [k,v,f]는 주어진 위치의 글자가 k,v,f 중 하나이면 true입니다.

간단한 예를 하나 들어봅시다.
예를 들어서.. 파일네임이 g 혹은 w로 시작되고, 세번째 글자가 t에서 z사이여야 한다면 다음과 같은 마스크를
주면 됩니다.
"[q, w]?[t-z]*.*"
알고보면 간단하죠? 하지만 헬프만 보고 써보려고 하면.. 노가다랍니다.


오늘의 팁은 여기까지입니다.
빌더에서 파일네임 관련 함수들은 금방 찾기도 힘들고.. 이런 함수들이 있었다는 것만 기억해둬도 나중에
필요할때 큰 도움이 될겁니다. 저만 해도 이런 함수들을 몰랐을때 는 직접 만들어서 썼답니다.. 미련하게시리... ^^

적어도 담주 월요일이나 화요일까지는 다시 네트웍이 살아날 거라고 생각되네요.
그럼, 그때까지 안녕히...


독립문에서 임펠리테리였습니다.

+ -

관련 글 리스트
179 팁! 파일이름 관련 VCL 함수들 박지훈.임프 18119 1999/06/04
(링크)     C++Builder Tip'N Tricks > 팁! 파일이름 관련 VCL 함수들
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.