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
[74780] Re:Re:Re:Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ
오랑캐꽃 [oranke] 3901 읽음    2018-01-22 23:35
오래전 도스에서 만들어진 어플리케이션이라면 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 콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 뽀뽀중 3506 2018/01/17
74754     Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 빌더(TWx) 3273 2018/01/22
74758         Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 뽀뽀중 3488 2018/01/22
74775             Re:Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 빌더(TWx) 3426 2018/01/22
74779                 Re:Re:Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 뽀뽀중 3744 2018/01/22
74782                     Re:Re:Re:Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 빌더(TWx) 3420 2018/01/23
74784                         감사 합니다. 뽀뽀중 3292 2018/01/23
74780                     Re:Re:Re:Re:Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 오랑캐꽃 3901 2018/01/22
74783                         감사 합니다. 뽀뽀중 3555 2018/01/23
74751     Re:콘솔(도스)프로그램실행할때 경로에 공백이 있으면 실행이 안됩니다. ㅠㅠ 초보심재민 3376 2018/01/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.