Lookup table et fichier texte

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Lookup table et fichier texte

Message 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:
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Lookup table et fichier texte

Message 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
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Lookup table et fichier texte

Message 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
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Lookup table et fichier texte

Message par Ar-S »

Désolé jag12 j'avais pas lu comme il faut..
@cage, tu as vu mon context menu builder ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Lookup table et fichier texte

Message 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
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Lookup table et fichier texte

Message 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)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Lookup table et fichier texte

Message par cage »

@JagV12
As-tu résolu ton problème, et si oui, qu'elle solution as-tu adopté ?
cage
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
JagV12
Messages : 20
Inscription : sam. 06/janv./2018 11:39

Re: Lookup table et fichier texte

Message 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"...
Répondre