Page 3 sur 3

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 14:57
par Marc56
cage a écrit :La demande de JagV12
Attention, on ne parle pas de la même chose. Moi, je veux, en un clic (droit) et une frappe clavier (la touche L en l'occurrence et la commande s'appelle Listing), lister (dans un fichier sur le dossier parent (celui qui est à l'écran donc), pour ne pas devoir aller le chercher ailleurs), le dossier sur lequel je viens de faire le clic droit. En résumé, un clic, une touche, c'est fait.
C'est exactement ce que j'ai proposé là :P
https://www.purebasic.fr/french/viewtop ... 88#p206688
et avec juste un clic droit, pas besoin du clavier
Et on peut aussi l'utiliser en ligne de commande
Modifiable facilement (ex: Ajouter un pathrequester et un emplacement différent pour sauver le fichier)

Mais bon, si JagV12 veut absolument faire de la ligne de commande, je n'insiste pas :roll:

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 15:11
par cage
@Marc56
J'avoue que parfois je préfère la simplicité offerte par la base de registre et des commandes Windows classiques.
Mon Bureau en sait quelque chose vu tous les menus que j'ai rajouté au clic droit.
Que du standard, pas une once de PB.
Bon je sort, on est dans un Forum dédié PB :oops:
cage

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 18:27
par cage
Je ne peux m’empêcher d'évoquer l'utilitaire snap2HTML que je trouve très pratique.
Il permet de réaliser un instantané (snapshot) de la structure des dossiers d'un disque et son enregistrement au format html.
Je l'utilise avec un clic droit sur le dossier dont je veux un instantané.
Contenu de la base de registre:

Code : Tout sélectionner

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\Snap2html]

[HKEY_CLASSES_ROOT\Directory\shell\Snap2html\command]
@="Y:\\WIN\\Snap2HTML\\snap2HTML.exe -path:\"%1\" -outfile:\"d:\\users\\admin\\desktop\\snapshot.html\""
cage

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 22:44
par Ar-S
Désolé jag12 j'avais pas lu comme il faut..
@cage, tu as vu mon context menu builder ?

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 23:36
par cage
@Ar-S
@cage, tu as vu mon context menu builder ?
Oui et c'est pas mal du tout.
Tu indiques mêmes que se sont mes .reg qui t'on donné l'idée.
J'en suis arrivé a un point, ou je ne fais plus que maintenir mes menus pour qu'ils restent opérationnels.
Je commence même a manquer de place lorsque je fais clic droit sur le Bureau.
Pour le reste de mes menus, j'utilise une applications super sympa "Quick Access Popup" activable avec un appui sur le bouton central de la souri.
Avec ces 2 solutions, j'ai tout a porté de clic.
cage

Re: Lookup table et fichier texte

Publié : jeu. 12/mars/2020 10:05
par Ar-S
Pour ça j'ai un clavier G105 avec 5 touches G1...G5 programmables du coup je lance quelques applis ainsi. :D (pareil pour la souris G502, des profils jeux et des profils bureautiques)

Re: Lookup table et fichier texte

Publié : mar. 17/mars/2020 0:56
par cage
@JagV12
As-tu résolu ton problème, et si oui, qu'elle solution as-tu adopté ?
cage

Re: Lookup table et fichier texte

Publié : mar. 17/mars/2020 3:48
par JagV12
Oui, j'ai résolu mon problème avec le principe KISS. J'ai donc une valeur chaîne de clé de registre qui contient "cmd /c chcp 1252 & cmd /c dir "%1" /A /S /C > _Listing.txt".

La valeur "CMD.EXE /u /c DIR "%1" /A /S /C >"_Listing.txt"" fonctionnait mais le fichier UNICODE généré ne s'affichait pas correctement dans Chrome.

Par contre, j'ai finalisé mon programme PureBasic dont voici le listing complet :

Code : Tout sélectionner

EnableExplicit

Enumeration File
  #SourceFile
EndEnumeration

Procedure ConvertFile(sFileName.s)
  Protected.i iStrIndex, iFileLength, iBytes, *MemoryID
  Protected.a aCharVal, aCP850
  Static.s sCP1252to850LUT = "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»¦¦¦¦¦ÁÂÀ©¦¦++¢¥++--+-+ãÃ++--¦-+¤ðÐÊËÈiÍÎÏ++¦_¦Ì¯ÓßÔÒõÕµþÞÚÛÙýݯ´-±=¾¶§÷¸°¨·¹³²¦ "
;   Static Dim aCP1252to850LUT.a(128)

  If OpenFile(#SourceFile, sFileName, #PB_Ascii)
    
    iFileLength = Lof(#SourceFile)
    If iFileLength
      If ReadCharacter(#SourceFile, #PB_Ascii) = $A0 ; Make sure the file hasn't been already converted
        MessageRequester("Information", "File '" + sFileName + "' already converted")
      Else
        FileSeek(#SourceFile, 0)
        
        Debug "File Length: " + Str(iFileLength)
        *MemoryID = AllocateMemory(iFileLength)
        If *MemoryID
          iBytes = ReadData(#SourceFile, *MemoryID, iFileLength)   ; Read the Data in the File and store then in the Memory block
          Debug "Nombre d'octets lus: " + Str(iFileLength)
          iFileLength = iFileLength ; Both should be identical but it's safer to work with actually read data size
          ShowMemoryViewer(*MemoryID, iFileLength)
;           ShowMemoryViewer(@sCP1252to850LUT, 256) ; LUT is 16bit UNICODE; 128 char => 256 bytes
          
          
;           If Not(aCP1252to850LUT(0)) ; Initialize aCP1252to850LUT array only once
;             For iStrIndex = 0 To 127
;               aCP1252to850LUT(iStrIndex) = Asc(Mid(sCP1252to850LUT, iStrIndex, 1))
;             Next
;           EndIf
          
          PokeA(*MemoryID, $A0) ; invisible tag (in replacement of SPC = $20) for the new file
          
          For iStrIndex = 1 To iFileLength - 1
            aCharVal = PeekA(*MemoryID + iStrIndex)
;             Debug "aCharVal = '" + Chr(aCharVal) + "' = Chr(" + aCharVal + ")"
            If aCharVal > 127
              aCP850 = Asc(Mid(sCP1252to850LUT, aCharVal - 127, 1))
;               aCP850 = Asc(sCP1252to850LUT(aCharVal - 128))
;               aCP850 = aCP1252to850LUT(aCharVal - 128)
  
;               Debug "New  Val = '" + aCP850 + "'"
              PokeA(*MemoryID + iStrIndex, aCP850)
;               ShowMemoryViewer(*MemoryID, iFileLength)
            EndIf
          Next
          
          ShowMemoryViewer(*MemoryID, iFileLength)
          
          FileSeek(#SourceFile, 0)
          iBytes = WriteData(#SourceFile, *MemoryID, iFileLength)
          
          FreeMemory(*MemoryID)
        Else
          MessageRequester("Warning", "Memory Allocation Error !", #PB_MessageRequester_Warning)
        EndIf
      
        CloseFile(#SourceFile)
;         MessageRequester("Information", "File '" + sFileName + "' converted")
      EndIf
    Else
      MessageRequester("Warning", "File '" + sFileName + "' is Empty !", #PB_MessageRequester_Warning)
    EndIf
  Else
    MessageRequester("Warning", "Can't open '" + sFileName + "' !", #PB_MessageRequester_Warning)
  EndIf
EndProcedure 

Procedure.i BackwardFind(sString.s, sSearchFor.s, iStart)
  Protected.i iStrIndex, iSearchLength = Len(sSearchFor)
  
  If iStart >= iSearchLength
    iStrIndex = iStart - iSearchLength + 1 ; + 1 because Mid() is 1 based
  Else
    iStrIndex = 0
  EndIf
  
  While iStrIndex And Mid(sString, iStrIndex, iSearchLength) <> sSearchFor
    iStrIndex = iStrIndex - 1
  Wend ; Exit with 0 if none
  ProcedureReturn iStrIndex
EndProcedure


;****************************************************** Main ********************************************************************;

Define.i iProgramParametersNum, iCharIndex, iIsFile, iRunProgramValue
Define.s sDirectory, sWorkingDirectory, sCliCommand, sTrash, sFileName

iProgramParametersNum = CountProgramParameters()
If iProgramParametersNum
  iIsFile = ReadFile(#SourceFile, ProgramParameter(0), #PB_File_NoBuffering)
  If iIsFile
    CloseFile(#SourceFile)
    ConvertFile(ProgramParameter(0))
  Else
    sDirectory = ProgramParameter(0)
    If iProgramParametersNum >= 2
      sFileName = ProgramParameter(1)
    Else
      sFileName = "_Listing.txt"
    EndIf
    
    ; Move to parent directory (to mimic original behavior)
    iCharIndex = BackwardFind(sDirectory, "\", Len(sDirectory) - 1) ; - 1 to get rid of the last char (in case it's a '\')
    
    If iCharIndex
      sWorkingDirectory = Left(sDirectory, iCharIndex)
    Else
      sWorkingDirectory = "C:\Windows\System32\"
    EndIf
    sCliCommand = "/C DIR " + Chr(34)  + sDirectory + Chr(34)  + " /A /S /C >" + Chr(34) + sFileName + Chr(34) + " 2>&1"
    iRunProgramValue = RunProgram("CMD.EXE", sCliCommand, sWorkingDirectory, #PB_Program_Wait | #PB_Program_Hide)
    ConvertFile(sWorkingDirectory + sFileName)
  EndIf

EndIf

End
Il permet donc aussi de convertir un fichier avec" iIsFile = ReadFile(#SourceFile, ProgramParameter(0), #PB_File_NoBuffering)". Je ne suis pas certain du rôle de "#PB_File_NoBuffering", mon but était de ne pas perdre de temps à transférer le fichier en mémoire...

Il subsiste des tentatives infructueuses d'utilisation d'un tableau d'ASCII.a pour une accès plus direct par "aCP480 = aCP1252to480LUT(aCharVal - 128)" plutôt que par "aCP480 = Asc(Mid(sCP1252to480LUT, aCharVal - 127, 1))". Cela a-t-il un intérêt ? Comment auriez-vous fait ?

Le mot clé Static n'aurait d’intérêt que si la fonction était appelée plusieurs fois. Comme ce n'est pas le cas ici, il n'est là que pour le principe...

Dernier point, j'ai un peu de mal à savoir si je convertis de CP1252 vers CP850 ou le contraire... Ma LUT est CP850(128-255) mais, si j'utilise la console, je demande "chcp 1252"...