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

델파이 FAQ
Delphi Programming FAQ
[4] [WIN32 API] 도스에서처럼 8.3 포맷의 파일이름 알아내기
박지훈.임프 [cbuilder] 23768 읽음    2000-06-13 00:00
/Q//

혹시 도스에 짧은 파일명을 구하는 함수가 없습니까?



/A//

도스에서 쓰이던 포맷인 8.3 포맷의 파일이름을 구해주는 함수가 있습니다.
있을 수 밖에 없답니다. 짧은 파일명(혹은 8.3파일명)과 긴 파일명은 어떤 규칙에 의해
매칭되는 것이 아니라, 단지 파일시스템에 기록된 대로 매칭될 뿐입니다. 가령,
"새로 만들기 텍스트 문서.txt"라는 파일이 있고 이 파일의 짧은 파일명이 "새로만~1.txt"
였다고 하더라도, 이 파일이름을 탐색기에서 다르게 바꾸어도 짧은 파일명은 바뀌지
않습니다. 앞서 말했듯이 파일시스템상에서 두개의 이름이 함께 기록되어 있는 관계일 뿐이기
때문이죠. 그래서, 긴파일이름을 안다고 해서 이 긴파일의 이름만으로 짧은파일이름을
유추해낼 수는 없습니다.

그러므로 당연히 파일시스템에 기록된 두 이름간의 연관관계를 조사해서 리턴해주는 함수가
있습니다. 빌더의 vcl에 준비된 함수가 있는데, ExtractShortPathName()입니다. 그런데...
불행히도 이 간편하고 좋은 함수에 버그가 있어서, 그대로 사용할 수가 없습니다.
(빌더에서만 발생하는 버그인듯 합니다.)
그래서, 이 함수가 내부적으로 호출하는 api 함수를 직접 호출해야 하는데, 이름은 GetShortPathName()입니다.
단, 이 함수는 vcl의 ExtractShortPathName()보다는 사용법이 조금은 복잡합니다.
함수의 프로토타입이,
DWORD GetShortPathName(LPCTSTR lpszLongPath, LPTSTR lpszShortPath, DWORD cchBuffer);
입니다. 첫번째 인자는 물론 표준 C 스트링형태의 긴파일이름이고, 두번째 인자는 넘겨받을
버퍼의 포인터, 세번째 인자는 버퍼에 미리 할당되어 있는 메모리의 양입니다.
두번째 인자로 넘겨줄 버퍼에 미리 할당할 메모리의 양이 좀 애매한데, 사실 이 크기는
파일시스템에 따라 다르므로 성급하게 그냥 특정값으로 지정하지 말고, 빌더의 헤더파일에
미리 정의된 MAX_PATH 값을 적용하는 것이 안전합니다. 이 MAX_PATH 값은 현재 파일시스템에서
허용하는 최고의 패스 길이값으로 선언되어 있습니다.
(도스에서 사용하던 FAT/VFAT은 패스문자열의 최장 길이가 255였는데, NTFS나 CDFS는 얼마인지
정확히 모르겠습니다. 그렇지만 알 필요가 없죠. ^^)
그러므로.. 다음과 같이 사용하면 됩니다.
AnsiString FileName = "c:\\Program Files\\Common Files\\Borland Shared\\Debugger\\bordbk41.dll";
char Buffer[MAX_PATH];
GetShortPathName(FileName.c_str(), Buffer, sizeof(Buffer));
이렇게 하면 Buffer에 c:\PROGRA~1\COMMON~1\BORLAN~1\Debugger\bordbk41.dll
라고 리턴됩니다.

참고로, 이와는 반대로, 짧은이름을 긴이름으로 바꾸려면 GetFullPathName() api함수를
사용하면 됩니다.


+ -

관련 글 리스트
4 [WIN32 API] 도스에서처럼 8.3 포맷의 파일이름 알아내기 박지훈.임프 23768 2000/06/13
(링크)     C++Builder FAQ > [WIN32 API] 도스에서처럼 8.3 포맷의 파일이름 알아내기
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.