Sous W7x64, je désire pouvoir lister mes répertoires et sous-répertoires dans un fichier texte. J'ai trouvé une solution sur internet : ajouter une entrée "Chaîne" dans la base de registres contenant cmd.exe /c dir "%1" /A /S /C > "_Listing.txt".
Mais le listing obtenu est rempli de caractère étranges : il est encodé en ASCII Code Page 1252 et affiché (par Notepad et autres) en Code Page 480.
J'ai donc écrit un programme faisant la conversion inverse au moyen d'une LookUp Table et dont voici la partie utile :
Code : Tout sélectionner
EnableExplicit
Enumeration File
#SourceFile
#DestFile
EndEnumeration
Procedure ConvertFile(sFileName.s)
Static.s sCP1252to480LUT = "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»¦¦¦¦¦ÁÂÀ©¦¦++¢¥++--+-+ãÃ++--¦-+¤ðÐÊËÈiÍÎÏ++¦_¦Ì¯ÓßÔÒõÕµþÞÚÛÙýݯ´-±=¾¶§÷¸°¨·¹³²¦ "
If ReadFile(#SourceFile, sFileName, #PB_Ascii)
If CreateFile(#DestFile, sDestFileName, #PB_Ascii)
WriteStringN(#DestFile, "Converted", #PB_Ascii) ; Tag the new file as "Converted"
While Eof(#SourceFile) = 0
sString = ReadString(#SourceFile, #PB_Ascii)
*sString = Ascii(sString)
sResult = ""
iStrLength = MemorySize(*sString)
; ShowMemoryViewer(*sString, iStrLength)
For iStrIndex = 0 To iStrLength - 1
Debug "sCharVal = '" + Str(PeekA(*sString + iStrIndex)) + "'"
If PeekA(*sString + iStrIndex) > 127
sResult = sResult + Mid(sCP1252to480LUT, PeekA(*sString + iStrIndex) - 127, 1)
Debug "New Val = '" + Mid(sCP1252to480LUT, PeekA(*sString + iStrIndex) - 127, 1) + "'"
Else
sResult = sResult + Mid(sString, iStrIndex + 1, 1)
EndIf
Next
WriteStringN(#DestFile, sResult, #PB_Ascii)
FreeMemory(*sString)
Wend
CloseFile(#DestFile)
MessageRequester("Information", "File '" + sDestFileName + "' created")
Else
MessageRequester("Warning", "Can't create Destination File !", #PB_MessageRequester_Warning)
EndIf
CloseFile(#SourceFile)
Else
MessageRequester("Warning", "Can't open '" + sFileName + "' !", #PB_MessageRequester_Warning)
EndIf
EndProcedure
Define.i iProgramParametersNum
Define.s sFile
iProgramParametersNum = CountProgramParameters()
If iProgramParametersNum
sFile = ProgramParameter(0)
ConvertFile(sFile)
EndIf
End
C'est évidemment la boucle For-Next qui réalise la conversion. (Ça fonctionne mais vos suggestions concernant des améliorations seront bienvenues)
Je voudrais maintenant sauvegarder la transformation dans le même fichier (plutôt que d'en créer un nouveau). Or si je fais :
Code : Tout sélectionner
If OpenFile(#SourceFile, sFileName, #PB_Ascii)
While Eof(#SourceFile) = 0
sString = ReadString(#SourceFile, #PB_Ascii)
sResult = bla bla bla ; nouvelle chaîne de même longueur que la chaîne source
WriteStringN(#SourceFile, sResult, #PB_Ascii)
Wend
CloseFile(#SourceFile)
Quelle est la solution ?
Par avance merci