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
[74783] 감사 합니다.
뽀뽀중 [kissjung] 3524 읽음    2018-01-23 05:38
GetShortPathName 이라는 함수가 있었네요. 이번에도 새롭게 배우게 되었습니다. ^^;
적용성을 검토해 봐야 겠습니다.

감사 합니다.

오랑캐꽃 님이 쓰신 글 :
: 오래전 도스에서 만들어진 어플리케이션이라면 8.3 형식의 파일명만 인식할 듯 합니다.
: GetShortPathName() 이라는 API를 사용해보세요. (추억 돋는...)
: https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa364989(v=vs.85).aspx
:
: 델파이를 예로 들면 대충 다음과 같습니다. 폼에 TOpenDialog  와 버튼 하나 올리고요...
:
:
: procedure TMainForm.Button1Click(Sender: TObject);
: var
:   len: Cardinal;
:   str: PChar;
: begin
:   if not opendialog1.Execute then  exit;
: 
:   len := GetShortPathName(PChar(OpenDialog1.FileName), nil, 0);
:   if len = 0 then
:   begin
:     ShowMessage('에러야~~');
:     Exit;
:   end;
: 
:   str:= stralloc(len+1);
:   GetShortPathName(PChar(OpenDialog1.FileName), str, len);
: 
:   ShowMessage(str);
: 
:   strdispose(str);
: end;
: 

:
: 이런 식으로 "짧은 파일명"을 얻어서 인자로 전달 해 보세요.
:
: 다만... 요즘 세상에 이런걸 누가 쓸 일이 없어서일까요... 제가 쓰는 PC의 경우 C: 에서만 "짧은파일명"이 제대로 표시되는군요.
: 나머지 D:, E: 에서는 저 위의 코드가 긴 파일명을 그대로 반환합니다.
: (NTFS가 아닌 FAT32 또는 삼바로 연결된 드라이브에서는 제대로 나오는군요.)
:
: 참고로 fsutil 을 사용하면 이 설정을 켜거나 끌 수 있습니다. 관리자 권한으로 콘솔창을 열고 다음과 같이 해 보세요.
:
:
: C:\WINDOWS\system32> fsutil 8dot3name query e:
: 볼륨 상태가 1(8dot3 이름 만들기 사용 안 함)입니다.
: 레지스트리 상태가 기본값인 2(볼륨별 설정)입니다.
: 
: 위의 두 설정에 따라 e:에서 8dot3 이름 만들기가 사용되지 않습니다.
: 

:
: 설정할 때는 다음과 같이 합니다.
:
:
: C:\WINDOWS\system32>fsutil 8dot3name set e: 0
: e:에서 8dot3name 생성을 사용하도록 설정했습니다.
: 

:
: 아쉽게도 기존파일은 영향이 없고, 새로 생성되는 파일에만 적용됩니다.
:
:
: 덤: dir 명령 뒤에 /x 를 붙여주면 짧은 파일이름이 함께 보여요.
: 덤2: 1998년에 작성된 콘솔 프로그램이 지금도 현역으로 돌아가는군요... 감동...
:
: fsutil 참고:
: https://blogs.msdn.microsoft.com/winsdk/2013/10/09/getshortpathname-doesnt-return-short-path-name/
:
:
: 뽀뽀중 님이 쓰신 글 :
: : 빌더(TWx) 님이 쓰신 글 :
: : : 뽀뽀중 님이 쓰신 글 :
: : : : 답변 감사 드립니다.
: : : :
: : : : 폴더에 공백이 있을 경우 따옴표로 감싸면 실행파일 경로에 공백이 있을 경우도 도스 프로그램이 실행되는 것을 검색을 통해 알게 되었습니다.
: : : :
: : : : 이부분도 테스트를 해 보았습니다만,,,  입력파일 경로에 공백이 있는 경우 "" 로 감싼 경우도 에러가 발생 했습니다.
: : : : 이 부분도 제 질문글에 설명을 하였습니다.
: : : :
: : : : 도스에서 직접 몇몇 경우에 대해 테스트를 했는데,,,
: : : : 실행할경우는 ""로 감싼 경우는 경로에 공백이 있어도 실행이 되었습니다.
: : : : 다만, 입력파일 경로는 공백이 있을 경우 "" 로 감싸도 에러가 발생하였습니다.
: : : :
: : : : 아마도 도스 프로그램이 포트란으로  1998년경  제작된 프로그램이라 입력자료 경로에 공백이 있을경우 공백을 무시하는 것 같습니다.
: : : : 즉, 오류 수정이 불가능할것 같아... 입력파일 경로에 공백이 있으면, 경고 메세지를 보여 주는 것으로 변경 하였습니다.
: : : :
: : : : 프로그래밍을 누군가에게 배워본적 없이 인터넷 검색만으로 해결하다 보니,
: : : : 기초가 많이 부족 합니다. 많은 이해 부탁 드립니다.
: : : :
: : : : 답변이 많은 도움이 되고 있습니다. 감사 합니다.
: : :
: : :
: : : 답변:
: : :
: : :
: : :
: : : wchar_t *cmdLine = L"\"C:\\Some Directory\\Test.exe\"";
: : : 

: : :
: : :
: : : 위와 같이 패스 경로에 공백이 있을 경우 쿼테이션 마크를 주므로써 처리가 가능 하죠?
: : :
: : : Test.exe 라는 콘솔모드 프로그램이...
: : :
: : : int main(int argc, wchar_t **argv)
: : : {
: : :     for (int i = 0; i < argc; ++i)
: : :         printf("%s\n", argv[i]);
: : :     _gettche();
: : :     return 0;
: : : }
: : :
: : : 위와 같이 프로그램에 전달된 코맨드 라인 옵션을 프린트 한다고 해 봅시다.
: : :
: : : 그리고...
: : :
: : : Test.exe 프로그램에...
: : :
: : :
: : : "C:\\User Dir"
: : : 

: : :
: : : 와 같이 공백이 들어있는 패스경로를 커맨드라인 옵션으로 CreateProcess() API를 이용해서 전달 하려면...
: : : 마찬가지로 아래와 같이 쿼테이션 마크를 넣어주면 되요.
: : :
: : :
: : : 	wchar_t *cmd = L"\""\"C:\\Some Directory\\Test.exe\\" \"C:\\User Dir\"";
: : : 	STARTUPINFO si = { sizeof(si), 0};
: : : 	PROCESS_INFORMATION pi = {};
: : : 	bool b = CreateProcess(0, cmd, 0, 0, false, 0, 0, 0, &si, &pi);
: : : 	CloseHandle(pi.hProcess);
: : : 	CloseHandle(pi.hThread);
: : : 
: : : 

: : :
: : : Test.exe 콘솔모드 프로그램은
: : : argv 첫번째 인수로 Test.exe 프로그램의 full-path 를 프린트 할 것이고
: : : 두번째 파라미터로 공백이 포함된 커맨드 라인 옵션을 하나의 옵션으로 인식해서 'C:\User Dir' 를 프린트 할 것임.
: : :
: : : 콘솔모드 프로그램이냐 아니냐의 차이 때문이 아님.
: :
: :
: : 도스에서 직접 프로그램을 실행 시켰 보았습니다.
: :
: : **************
: : D:\>hec1.exe "D:\새 폴더 (2)\00020120.hec"
: :
: : UNABLE TO OPEN INPUT FILE ===>D:\새폴더(2)\00020120.hec                                              
: : PROGRAM ABORTED
: : Stop - Program terminated.
: :
: :
: : D:\>
: : **************
: :
: : 결과는 위와 같습니다.
: : 공백이 포함된 폴더에 데이터 파일을 넣었고, 실행 파일은 D 드라이브에 위치 합니다.
: :
: : "D:\새 폴더 (2)\00020120.hec" 라는 폴더 경로가 프로그램에서는 공백이 없는 D:\새폴더(2)\00020120.hec 로 인식을 한것 같습니다.
: :
: : 이는 프로그램 자체에서 공백을 인식 못하는 것으로 생각 하고 있는데, 제 생각이 틀린것인가요?
: :
: : (도스프로그램 및 입력자료는 첨부 하였습니다.)

+ -

관련 글 리스트
74747 콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 뽀뽀중 3485 2018/01/17
74754     Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 빌더(TWx) 3246 2018/01/22
74758         Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 뽀뽀중 3462 2018/01/22
74775             Re:Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 빌더(TWx) 3404 2018/01/22
74779                 Re:Re:Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 뽀뽀중 3720 2018/01/22
74782                     Re:Re:Re:Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 빌더(TWx) 3400 2018/01/23
74784                         감사 합니다. 뽀뽀중 3268 2018/01/23
74780                     Re:Re:Re:Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 오랑캐꽃 3872 2018/01/22
74783                         감사 합니다. 뽀뽀중 3524 2018/01/23
74751     Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 초보심재민 3350 2018/01/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.