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

C++빌더 Q&A
C++Builder Programming Q&A
[2046] Re:[질문] 도스처럼 짧은 파일명 구하는 방법?
박지훈.임프 [cbuilder] 3852 읽음    1999-10-04 00:00
: 안녕하세요. ^^;
:
: 혹시 도스처럼 ~표시로 짧은 파일명 구하는 함수가 있는지
:
: 없으면.. 구하는 방법이라도.. 제가 아래처럼 해봤는데 보통은 잘되는데
: 한글파일명중에.. 파일을 '한글을 정 단위로 끝어지면 잘출력되는데 반으로 끝어지면
: 프로그램이 에러가 납니다.'
:
:     done = FindFirst(DirName, faAnyFile, file);
:     while(!done)
:     {
:         filename = file.Name;
:         if(filename.Pos(".") == 0)
:             filefirst = filename;
:         else
:             filefirst = filename.SubString(0, filename.Pos(".")-1);
:            
:         if(filefirst.Length() > 8)  //파일길이가 8이상으로 길때
:         {
:             filefirst = filefirst.SubString(0, 7);
:             strcat(filefirst.c_str(), "~");
:         }
:         strcpy(p->FileFirst, filefirst.c_str());
:
:         done = FindNext(file);
:     }
:
: 위에 처럼했더니 한글파일명일때 문제가 있습니다.
:
: 혹시 도스에 짧은 파일명을 구하는 함수가 없습니까?
: extractfilename()은 아닌것같고..
:
:
: 끝..



임펠리테리입니다.

도스에서 쓰이던 포맷인 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함수를
사용하면 됩니다.

그럼 참고하시길...

+ -

관련 글 리스트
2044 [질문] 도스처럼 짧은 파일명 구하는 방법? 강민주 3265 1999/10/04
2046     Re:[질문] 도스처럼 짧은 파일명 구하는 방법? 박지훈.임프 3852 1999/10/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.