2008-11-03 5 views
5

"C : \ Documents and settings"와 같은 "긴 이름"을 해당 "짧은 이름"으로 변환하는 표준 버그 방지 방법을 찾고 있습니다. "C : \ DOCUME ~ 1 ".net의 짧은 경로로 변환하는 표준 방법

내 C# 응용 프로그램을 사용하여 외부 프로세스를 실행하려면이 코드가 필요합니다. 나가 "긴 이름"에있는 경로로 그것을 먹이면 그것은 실패합니다.

+0

"짧은 경로"는 "8.3 이름"이라고합니다. – user17753

답변

4

이 외부 프로세스는 따옴표로 긴 파일 경로를 묶어야 경우에도 실패 하는가를 참조하십시오? 외부 앱이 지원하는 경우 간단한 방법 일 수 있습니다.

myExternalApp "C:\Documents And Settings\myUser\SomeData.file" 
+0

그것은 작동합니다. 무슨 일이 일어나는지 설명하는 설명이나 문서가 있습니까? – Hanan

+0

아닙니다. 문자열이 따옴표로 구분 된 경우 공백으로 인수를 허용하는 것은 (합리적으로) 현대 응용 프로그램의 표준 동작입니다 ... – ZombieSheep

+2

경로는 기본적으로 명령 줄 옵션이고 공백은 명령 줄 옵션의 구분 기호이므로 따옴표가 필요합니다. 공백이있는 경로를 사용하면 명령 줄이 여러 옵션으로 구문 분석됩니다. 정의 : "공백"- 문자가없는 것으로 종종 간주되는 ASCII 문자 –

19

Windows API 함수를 호출 할 준비가되어 있으면 GetShortPathName() 및 GetLongPathName()이이 기능을 제공합니다.

http://csharparticles.blogspot.com/2005/07/long-and-short-file-name-conversion-in.html

const int MAX_PATH = 255; 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
    public static extern int GetShortPathName(
     [MarshalAs(UnmanagedType.LPTStr)] 
     string path, 
     [MarshalAs(UnmanagedType.LPTStr)] 
     StringBuilder shortPath, 
     int shortPathLength 
     ); 

    private static string GetShortPath(string path) { 
     var shortPath = new StringBuilder(MAX_PATH); 
     GetShortPathName(path, shortPath, MAX_PATH); 
     return shortPath.ToString(); 
    } 
+1

+1 (내부 버그로 인해) shortpath에서만 작동하는 exe를 통합하는 중입니다. –

+1

MAX_PATH = 260 in windows.h – Constantin

+0

이것은 단축 할'MAX_PATH'보다 큰 경로를 전달하면 실패 (아무것도 반환하지 않습니다). – user17753

3

WinAPI의 GetShortPathName 트릭은 잘 작동하지만 거기에 매우 긴 경로를 사용할 때는주의해야합니다.

경로가 MAX_PATH보다 긴 7zip을 호출 할 때 문제가 발생했습니다. 경로가 너무 길면 GetShortPathName이 작동하지 않습니다. "\? \"로 접두사를 붙이면 작업을 수행하고 올바르게 단축 된 경로를 반환합니다.

관련 문제