2010-06-01 5 views
2

파일 경로에서 GetShortNameW()를 사용하여 짧은 이름을 가져온 다음 나중에 긴 이름보기 GetLongNameA()를 검색하는 코드가 있습니다.Windows에서 긴 파일 이름 대 긴 파일 이름

원본 파일 단락의 변환에 따라

"C:/ProgramData/My Folder/File.ext" 

그러나 형식이다, 다시 길이로, 파일명 짧은 이름 형식이다

"C:/Program Files/My Folder/Filename.ext". 

된다

"C:/PROGRA~2/MY_FOL~1/FIL~1.EXT" 

짧은 이름을 잘못 해석했습니다.

코드는 (내가 VS2008의 프로젝트를 업그레이드 할 수 없습니다)

아무도 이런 일이 될 수있는 이유는 어떤 생각을 가지고 있습니까 Windows 7에서 VS 2005를 사용하여 컴파일?

DWORD pathLengthNeeded = ::GetShortPathNameW(aRef->GetFilePath().c_str(), NULL, 0); 
    if(pathLengthNeeded != 0) 
    { 
    WCHAR* shortPath = new WCHAR[pathLengthNeeded]; 
    DWORD newPathNameLength = ::GetShortPathNameW(aRef->GetFilePath().c_str(), shortPath, pathLengthNeeded); 
    if(newPathNameLength != 0) 
    { 
    UI_STRING unicodePath(shortPath); 
    std::string asciiPath = StringFromUserString(unicodePath); 

    pathLengthNeeded = ::GetLongPathNameA(asciiPath.c_str(),NULL, 0); 
    if(pathLengthNeeded != 0) 
    {// convert it back to a long path if possible. For goodness sake can't we use Unicode throughout?F 
    char* longPath = new char[pathLengthNeeded]; 
    DWORD newPathNameLength = ::GetLongPathNameA(asciiPath.c_str(), longPath, pathLengthNeeded); 
    if(newPathNameLength != 0) 
    { 
     std::string longPathString(longPath, newPathNameLength); 
     asciiPath = longPathString; 
    } 
    delete [] longPath; 
    } 

    SetFullPathName(asciiPath); 
    } 
    delete [] shortPath; 
    } 
+0

해당 파일이 들어있는 디렉토리에 대해'dir/x'의 출력은 무엇입니까? –

+0

GetShortPathName - C : \ ProgramData \ ...이 C : \ PROGRA ~ 2 \ ...에 매핑되고 C : \ Program Files \ ...이 C : \ PROGRA ~로 매핑되는 짧은 이름과 일치합니다. 1 \ ... 프로그래밍 방식으로 GetLongPathName을 통해 짧은 이름을 긴 이름으로 다시 변환하면 잘못 해석되는 것 같습니다. –

답변

1

GetShortPathNameA와 GetLongPathNameW가 같아야합니다.

GetLongPathNameA가 반드시 성공하지 않아야합니다. 8.3 경로 이름 만 ANSI 호환 가능하도록 [부분 보장됩니다].