Résultats imprévisibles de GetShortPathName

GetShortPathName () ne fonctionne pas comme prévu sur XP SP3

http://msdn.microsoft.com/en-us/library/aa364989(VS.85).aspx

Renvoie la chaîne d’entrée pour les chemins tels que:

C:\Test\LongFolderNameToTestWith\BinarySearch.ini 

exactement comme envoyé?

Encore:

 C:\Documents and Settings\LocalService\NTUSER.DAT 

Fait des noms courts pour le chemin, donc je sais que j’appelle l’API correctement.

Toutefois:

 C:\Documents and Settings\LocalService\BinarySearch.ini 

Ne fait pas un nom court du nom de fichier, mais fait des noms courts pour le chemin !?

Quelqu’un pourrait-il m’aider à comprendre ce comportement et peut-être suggérer une solution de rechange.

Ajoutée:

Je dois pouvoir créer un chemin / nom de fichier 8.3 pour passer à une application héritée

Comment cela peut-il être fait?

Ajouté: SOLUTION

Après avoir lu / expérimenté BEAUCOUP, il semble que le seul moyen fiable de faire cela est d’utiliser l’automatisation:

 ' ------------------------------------------------------------ ' Library Name: Microsoft Scripting Runtime 1.0 ' Library File: C:\WINDOWS\system32\scrrun.dll ' ------------------------------------------------------------ ' Version Info: ' ------------- ' Company Name: Microsoft Corporation ' File Description: Microsoft (R) Script Runtime ' File Version: 5.7.0.16599 ' Internal Name: scrrun.dll ' Legal Copyright: Copyright (C) Microsoft Corp. 1996-2006, All Rights Reserved ' Original Filename: scrrun.dll ' Product Name: Microsoft (R) Script Runtime ' Product Version: 5.7.0.16599 ' ------------------------------------------------------------ ' ProgID: Scripting.FileSystemObject ' Interface Name: ScriptingFileSystemObject ' ' Interface Prefix: Scripting 

Cela marche.

Une implémentation simple en BASIC serait:

 $PROGID_ScriptingFileSystemObject = "Scripting.FileSystemObject" Interface Dispatch ScriptingFileSystemObject Member CALL GetFile (IN FilePath AS STRING) AS ScriptingIFile Member CALL GetFolder(IN FolderPath AS STRING) AS ScriptingIFolder END Interface Interface Dispatch ScriptingFile Member GET ShortPath() AS STRING Member GET ShortName() AS STRING END Interface Interface Dispatch ScriptingFolder Member GET ShortPath() AS STRING Member GET ShortName() AS STRING END Interface '----------------------------------------------------------------------------- FUNCTION FileShortPath( BYVAL sPathnFile AS STRING, sShort AS STRING ) AS LONG LOCAL vResult, vFilePath AS Variant LOCAL fso AS ScriptingFileSystemObject LOCAL oFile AS ScriptingFile IF LEN(sPathnFile) = 0 THEN EXIT FUNCTION ' Nothing sent SET fso = NEW ScriptingFileSystemObject IN $PROGID_ScriptingFileSystemObject IF IsNothing(fso) THEN FUNCTION = -1 : EXIT FUNCTION SET oFile = NEW ScriptingFile IN $PROGID_ScriptingFileSystemObject IF IsNothing(oFile) THEN FUNCTION = -2 : EXIT FUNCTION vFilePath = sPathnFile vResult = Empty OBJECT CALL fso.GetFile(vFilePath) TO vResult SET oFile = vResult IF IsNothing(oFile) THEN FUNCTION = -3 : EXIT FUNCTION vResult = Empty Object GET oFile.ShortName TO vResult sShort = VARIANT$(vResult) vResult = Empty Object GET oFile.ShortPath TO vResult sShort = VARIANT$(vResult) IF LEN(sShort) THEN FUNCTION = 1 ' Success END FUNCTION 

Merci à tous pour vos suggestions.


J’essaie toujours de trouver un moyen fiable de créer un chemin / nom de fichier 8.3.

Y a-t-il un moyen de faire cela en dehors de l’utilisation de GETSHORTPATHNAME?

Résolu Voir au dessus

Il semble que MS continue à supporter cela pour les déciples COM seulement … pourquoi il n’est plus fiable dans l’API C rest un mystère.

C’est parce que le nom du fichier n’a pas de nom abrégé et que XP SP3 ne crée pas automatiquement un nom abrégé pour le fichier.

Vous pouvez vérifier ce paramètre de registre (s’il existe) pour voir à quoi il est actuellement défini.

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ FileSystem \ NtfsDisable8dot3NameCreation

Lorsque NtfsDisable8dot3NameCreation est défini sur 1, vous obtenez le comportement suivant:

Si un dossier / fichier a déjà un nom court, par exemple “Program Files”, il renverra le nom abrégé de ce dossier / fichier. Mais si un nom court n’existe pas, vous obtiendrez plutôt le nom long du fichier car il s’agit du seul nom existant pour cet object. Si les noms courts sont désactivés, il n’y a pas de nom abrégé à obtenir.

Selon la documentation citée précédemment, les noms abrégés seront générés uniquement si NtfsDisable8dot3NameCreation a pour valeur 0. Si la valeur a été modifiée, vous pouvez avoir des fichiers / répertoires contenant uniquement des noms longs. Cela expliquerait pourquoi votre appel à GetShortPathName peut abréger les noms du répertoire et les noms longs du fichier.

Je n’ai pas été en mesure de confirmer cela, mais je soupçonne qu’il peut exister une logique particulière dans Windows qui crée toujours des noms abrégés pour des répertoires critiques tels que “Documents and Settings”, car certains anciens programmes pourraient ne pas fonctionner.

Avez-vous essayé SetFileShortName ?