A toutes fins utiles,
Sous Windows, lorsque la longueur d'un nom d'arborescence, de dossier ou de fichier dépasse les 259 caractères, la commande FileSize(), même utilisée conjointement avec le préfixe "\\?\", ne fonctionne pas correctement.
Avoir défini la clé de registre "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled" à 1 ne change en rien cet état de fait.
Ci-dessous, donc, un FileSize-like qui reprend les mêmes principes que l'original à savoir une valeur de retour :
- -2 : Si le fichier passé en paramètre est en réalité un dossier
- -1 : Si le fichier ou dossier passé en paramètre n'existe pas
- >= 0 : La taille du fichier
- -3 : Dans l'éventualité d'une erreur non prévue (en théorie, cela ne devrait pas se produire)
Code : Tout sélectionner
; Fonction utilisable uniquement à partir de Windows 10 build 14352
; Par ailleurs, si absente, la clé "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled", avec pour valeur 1,
; doit être créée dans la base de registre. Un redémarrage Windows est alors nécessaire
Procedure.i FileSize_Like(ArgNomFichier.s)
; Retourne -3 si anomalie non prévue
; Retourne -2 si ArgNomFichier est un répertoire
; retourne -1 si le fichier/répertoire est inexistant
; sinon retourne la taille du fichier
Protected.i IdFichier,TailleHauteFichier,TailleBasseFichier,ValeurRetour
If Left(ArgNomFichier,4)<>"\\?\":ArgNomFichier="\\?\"+ArgNomFichier:EndIf
IdFichier=CreateFile_(@ArgNomFichier,#GENERIC_READ,#FILE_SHARE_READ,0,#OPEN_EXISTING,#FILE_FLAG_BACKUP_SEMANTICS,0)
If IdFichier=#INVALID_HANDLE_VALUE
; Debug " Dossier/Fichier inexistant"
CloseHandle_(IdFichier)
ProcedureReturn IdFichier
Else
CloseHandle_(IdFichier)
IdFichier=CreateFile_(@ArgNomFichier,#GENERIC_READ,#FILE_SHARE_READ|#FILE_SHARE_DELETE,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0)
If IdFichier=#INVALID_HANDLE_VALUE
If GetLastError_()=0
; Debug " "+ArgNomFichier+" est un fichier"
Else
If GetLastError_()=#ERROR_PATH_NOT_FOUND
; Debug " "+ArgNomFichier+" est un répertoire"
ValeurRetour=-2
Else
Debug " Code erreur "+GetLastError_()+" à gérer par l'utilisateur"
ValeurRetour=IdFichier
EndIf
EndIf
Else
TailleBasseFichier=GetFileSize_(IdFichier,TailleHauteFichier)
If TailleBasseFichier=#INVALID_FILE_SIZE And TailleHauteFichier=#Null
ValeurRetour=-3
Debug " Code erreur "+GetLastError_()+" à gérer par l'utilisateur"
Else
ValeurRetour=TailleBasseFichier
EndIf
EndIf
CloseHandle_(IdFichier)
ProcedureReturn ValeurRetour
EndIf
EndProcedure
Pour le test, créez, par exemple, via l'explorateur, l'arborescence suivante :
"C:\123456789-123456789-123456789-123456789-12456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-ABCDEFGHI\123456789-123456789-123456789-123456789-12456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-ABCDEFGHI\"
puis lancez
Code : Tout sélectionner
Fichier.s="C:\123456789-123456789-123456789-123456789-12456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-ABCDEFGHI\123456789-123456789-123456789-123456789-12456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-ABCDEFGHI\"
Debug Len(Fichier)
Debug FileSize(Fichier)
Debug FileSize("\\?\"+Fichier)
Debug FileSize_Like(Fichier)
Voilà.
[Edition 18.01.23 - Ajout, dans le code source, d'un commentaire lié à la version de Windows requise]