2010-06-01 5 views
2

J'ai du code qui obtient le nom abrégé à partir d'un chemin de fichier, en utilisant GetShortNameW(), puis récupère plus tard le nom long GetLongNameA().Noms de fichier courts par rapport aux noms de fichiers longs dans Windows

Le fichier d'origine est de la forme

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

Cependant, après la conversion en bref, puis de nouveau à long, le nom devient

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

Le nom court est de la forme

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

Le nom abrégé est incorrectement résolu.

Le code compile en utilisant VS 2005 sur Windows 7 (je ne peux pas mettre à jour le projet VS2008)

Est-ce que quelqu'un a une idée pourquoi cela pourrait se produire?

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

Quelle est la sortie de 'dir/x' pour le répertoire contenant ce fichier? –

+0

Il est cohérent avec le nom court donné par GetShortPathName - C: \ ProgramData \ ... correspond à C: \ PROGRA ~ 2 \ ..., et C: \ Program Files \ ... correspond à C: \ PROGRA ~ 1 \ ... La conversion du nom abrégé en nom long, par programmation via GetLongPathName, semble se résoudre incorrectement. –

Répondre

1

Cela aurait dû être l'inverse: GetShortPathNameA et GetLongPathNameW.

GetLongPathNameA ne doit pas nécessairement aboutir. Seuls les chemins d'accès 8.3 sont [partiellement garantis] compatibles ANSI.

Questions connexes