FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Concaténer des fichiers Emptypar Pedro Aujourd'hui à 10:37

» Un autre pense-bête...
Concaténer des fichiers Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Concaténer des fichiers Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Concaténer des fichiers Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Concaténer des fichiers Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Concaténer des fichiers Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Concaténer des fichiers Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Concaténer des fichiers Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Concaténer des fichiers Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Concaténer des fichiers Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Concaténer des fichiers Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Concaténer des fichiers Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Concaténer des fichiers Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Concaténer des fichiers Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Concaténer des fichiers Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment : -38%
Ecran PC gaming 23,8″ – ACER KG241Y P3bip ...
Voir le deal
99.99 €

 

 Concaténer des fichiers

Aller en bas 
AuteurMessage
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Concaténer des fichiers Empty
MessageSujet: Concaténer des fichiers   Concaténer des fichiers EmptyMar 13 Nov 2012 - 21:30

Ce n'est peut-être pas d'un intérêt puissant, mais j'avais besoin de regrouper plusieurs fichiers en un seul et de pouvoir les extraire ensuite de l'archive, évidemment.
Les fichiers, qui peuvent être de tous types (binaire, ascii, n'importe quoi), ne sont pas compactés comme dans un zip, ils sont simplement copiés bout à bout, avec un en-tête qui décrit le contenu. Ils sont restaurés à l'identique, avec leur nom.
La taille du fichier groupé est la somme de la taille des fichiers + la taille de l'en-tête.
Contrainte: ils doivent tous être dans un même répertoire (ou avoir été préalablement regroupés dans un seul répertoire), et être tous de même type (*.xxx), ou bien il s'agit de la totalité du répertoire (*.*).

Il y a un répertoire dédié pour ranger les fichiers regroupés, auxquels j'ai attribué arbitrairement le suffixe .zap (mais ça peut évidemment se changer, c'est un Edit, et tous les paramètres variables sont en tête du programme).

Le fichier résultat est un fichier binaire, les deux premiers octets contiennent le nombre de fichiers inclus, les deux octets suivants la taille de l'en-tête pour chaque fichier (ici 32, mais ça peut s'augmenter si on a des noms de fichiers très longs, 4 octets pour la taille du fichier, le reste pour le nom du fichier).
Je l'ai utilisé par exemple pour regrouper des fichiers images pour archivage (.jpg), le fichier résultat est illisible sans le programme de décodage (mais quand même lisible par n'importe quel programmeur à condition de décrypter la structure, et du texte contenu par n'importe qui sous éditeur).

Le programme contient les deux fonctions, concaténation et restitution:
Code:
' DGRX.BAS groupage de fichiers d'un type donné d'un répertoire en un seul
'          fichier, ou dégroupage du fichier résultat.
LABEL Dir, Clic, Cliclist, Annul, Exec, Grx, Dgrx
DIM fm$, fr$, fs$, fet$, rd$, rs$, p$, v%(10000), w%(5000), n, a$, b$, nm$
DIM i, j, k, lb, lg, rst, nbb, c$, na, hl, op$, lart, larr, suf$
fm$ = "C:\TEMP\DIR"
fet$ = "C:\TEMP\fentet"
rd$ = "C:\ZAPGRX\": ' répertoire de destination du dégroupage, à ajuster
suf$ = "zap": ' suffixe des fichiers compactés
' *****************************************************************
lart = 32: ' taille d'un article d'en-tête, modifiable sur demande
'          ' (nom de fichier sur lart-4 = 28 caractères maxi).
' *****************************************************************
WIDTH 0,250: HEIGHT 0, 430: FONT_BOLD 0
COLOR 0,200,255,255: BORDER_SMALL 0: CAPTION 0," GROUPAGE/DÉGROUPAGE DE FICHIERS"
ALPHA 2: TOP 2,4
CAPTION 2, " Répertoire résultat: " + rd$
hl = 180
LIST 6: TOP 6,20: LEFT 6,5: WIDTH 6,220: HEIGHT 6, hl
COLOR 6,255,255,190
ON_CLICK 6, Cliclist

BUTTON 3: TOP 3,hl+27: LEFT 3,35: CAPTION 3, "Groupage"
BUTTON 4: TOP 4,hl+27: LEFT 4, 115: CAPTION 4, "Dégroupage"
ON_CLICK 3, Clic: ON_CLICK 4, Clic

CONTAINER 10: TOP 10, hl+60: LEFT 10, 5: WIDTH 10, WIDTH(6): HEIGHT 10,155
COLOR 10,255,200,200: HIDE 10
ALPHA 11: PARENT 11,10: TOP 11,20: LEFT 11,5
EDIT 12: PARENT 12,10: TOP 12,35: LEFT 12,5: WIDTH 12,210
ALPHA 13: PARENT 13,10: TOP 13,60: LEFT 13,5
EDIT 14: PARENT 14,10: TOP 14,75: LEFT 14,5: WIDTH 14,210
PROGRESS_BAR 15: PARENT 15,10: TOP 15,103: LEFT 15,5: WIDTH 15,210
MIN 15,0
BUTTON 17: PARENT 17,10: TOP 17,125: LEFT 17,35: CAPTION 17, "Annuler"
ON_CLICK 17, Annul
BUTTON 18: PARENT 18,10: TOP 18,125: LEFT 18,115
ON_CLICK 18, Exec

DLIST 100
GOSUB Dir

END
' ==============================================================================
Dir:
EXECUTE_WAIT "CMD.exe /C DIR " + rd$+"*."+suf$+" /B >" + fm$
FILE_LOAD 6, fm$: FILE_DELETE fm$
na = COUNT(6): ' nb de fichiers déjà existants
IF na = 0 THEN RETURN
FOR i = 1 TO na
    a$ = ITEM_READ$(6, i)
    FILEBIN_OPEN_READ 1, rd$ + a$
    FILEBIN_BLOCK_READ 1,2,v%(0)
    FILEBIN_CLOSE 1
    n = v%(0)+256*v%(1)
    ITEM_DELETE 6,i: ITEM_INSERT 6, i, a$ + "  - "+STR$(n)+" fichiers"
NEXT i
RETURN
' ------------------------------------------------------------------------------
Clic:
SHOW 10
IF CLICKED(3) = 1
    ' *** Groupage
    CAPTION 10, " - GROUPAGE - "
    CAPTION 11, "Fichiers d'origine (path + \*.ext):"
    CAPTION 13, "Fichier résultat:"
    TEXT 12, "C:\GRAPH\JPG\*.jpg"
    TEXT 14, rd$+RIGHT$("0"+STR$(na+1),2)+"_GRX."+suf$
    CAPTION 18, "Grouper"
    op$ = "G"
ELSE
    ' *** Dégroupage
    CAPTION 10, " - DÉGROUPAGE - "
    CAPTION 11, "Fichier d'origine (."+suf$+"):"
    CAPTION 13, "Répertoire de destination:"
    TEXT 12, "* path, ou  clic un fichier ci-dessus *"
    TEXT 14, "C:\TEMP"
    CAPTION 18, "Dégrouper"
    op$ = "D"
END_IF
RETURN
' ------------------------------------------------------------------------------
Cliclist:
b$ = ITEM_INDEX$(6): ' ligne cliquée
k = INSTR(b$, "-"): b$ = RTRIM$(LEFT$(b$, k-1))
IF op$ = ""
    a$ = rd$ + b$ + CHR$(10)+"Supprimer définitivement ce fichier ?"
    i = MESSAGE_CONFIRMATION_YES_NO(a$)
    IF i = 1 THEN FILE_DELETE rd$ + b$
    GOSUB Dir
ELSE
    IF op$ = "D" THEN TEXT 12, rd$ + b$
END_IF
RETURN
' ------------------------------------------------------------------------------
Annul:
op$ = "": HIDE 10
RETURN
' ------------------------------------------------------------------------------
Exec:
IF op$ = "G"
    p$ = TEXT$(12): IF p$ = "" THEN RETURN
    fr$ = TEXT$(14): IF fr$ = "" THEN RETURN
    IF FILE_EXISTS(fr$) = 1
        a$ = fr$ + CHR$(10)+"Fichier existe déjà, le supprimer ?"
        i = MESSAGE_CONFIRMATION_YES_NO(a$)
        IF i <> 1 THEN RETURN
        FILE_DELETE fr$
    END_IF
    GOSUB Grx
    GOSUB Dir
ELSE
    fr$ = TEXT$(12)
    IF FILE_EXISTS(fr$) = 0 THEN MESSAGE "Fichier ."+suf$+" non trouvé.": RETURN
    rs$ = TEXT$(14): IF RIGHT$(rs$,1) <>"\" THEN rs$ = rs$ + "\"
    IF DIR_EXISTS(rs$) = 0
        MESSAGE "Répertoire " + rs$ + " inexistant !": RETURN
    END_IF
    GOSUB Dgrx
END_IF
op$ = "": HIDE 10
RETURN
' ------------------------------------------------------------------------------
Grx:
' *** Groupage ***
EXECUTE_WAIT "CMD.exe /C DIR " + p$ + " /O:N /-C >" + fm$
CLEAR 100
FILE_OPEN_READ 1, fm$: n = 0
    WHILE FILE_EOF(1) = 0
        FILE_READLN 1, a$
        IF a$ <> "" AND LEFT$(a$, 1) <> " "
            ITEM_ADD 100, a$: n = n + 1
        END_IF
    END_WHILE
FILE_CLOSE 1: FILE_DELETE fm$
IF n = 0 THEN MESSAGE "Pas de fichiers du type donné !": RETURN
MAX 15, n
v%(0) = MOD(n,256): v%(1) = INT(n/256): ' nombre de fichiers
v%(2) = MOD(lart,256): v%(3) = INT(lart/256): ' taille des articles d'en-tête
j = 4
FOR i = 1 TO n
    POSITION 15, i
    a$ = ITEM_READ$(100, i)
    lg = VAL(LTRIM$(MID$(a$, 18, 18)))
    v%(j+3) = INT(lg/16777216): rst = MOD(lg, 16777216)
    v%(j+2) = INT(rst/65536): rst = MOD(rst, 65536)
    v%(j+1) = INT(rst/256): v%(j) = MOD(rst, 256)
    nm$ = MID$(a$, 37, 100): k = lart-LEN(nm$)-4
    nm$ = nm$ + STRING$(k, " ")
    FOR k = 1 TO lart-4: v%(j+3+k) = ASC(MID$(nm$, k, 1)): NEXT k
    j = j + lart
NEXT i
FILEBIN_OPEN_WRITE 1, fet$: ' fichier d'en-tête
    FILEBIN_BLOCK_WRITE 1, lart*n+4, v%(0)
FILEBIN_CLOSE 1
EXECUTE_WAIT "CMD.exe /C COPY /B " + fet$ + "+" + p$ + " " + fr$ + " >NUL": ' concaténation
FILE_DELETE fet$
RETURN
' ------------------------------------------------------------------------------
Dgrx:
' *** Dégroupage ***
lb = 4096: ' buffer
FILEBIN_OPEN_READ 1, fr$: FILEBIN_BLOCK_READ 1, 4, v%(0)
n = v%(0) + 256*v%(1): ' nombre de fichiers inclus
larr = v%(2) + 256*v%(3): ' taille d'un article d'en-tête
FILEBIN_BLOCK_READ 1, larr*n, v%(0): ' en-tête (larr octets par fichier)
MAX 15, larr*n
FOR i = 0 TO larr*n-1 STEP larr
    POSITION 15, i: DISPLAY
    lg = v%(i)+256*v%(i+1)+256*256*v%(i+2)+256*256*256*v%(i+3): ' taille fichier
    c$ = ""
    FOR j = i+4 TO i+larr-1: c$ = c$ + CHR$(v%(j)): NEXT j
    fs$ = rs$ + RTRIM$(c$)
    nbb = INT(lg/lb): rst = MOD(lg, lb)
    FILEBIN_OPEN_WRITE 2, fs$
    IF nbb > 0
        FOR j = 1 TO nbb
            FILEBIN_BLOCK_READ 1, lb, w%(0): FILEBIN_BLOCK_WRITE 2, lb, w%(0)
        NEXT j
    END_IF
    IF rst > 0
        FILEBIN_BLOCK_READ 1, rst, w%(0): FILEBIN_BLOCK_WRITE 2, rst, w%(0)
    END_IF
    FILEBIN_CLOSE 2
NEXT i
FILEBIN_CLOSE 1
MESSAGE "Dégroupage effectué dans: " + rs$ + " ("+STR$(n)+" fichiers)."
RETURN
' ------------------------------------------------------------------------------
J'ai fait (15/11) une autre version (pas mise à jour ci-dessus, mais sur demande) avec possibilité de crypter le fichier résultat (cryptage simple, qui rend le contenu illisible dans un éditeur même si c'est du texte, mais qui ne résisterait pas à un programmeur).
Revenir en haut Aller en bas
 
Concaténer des fichiers
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» fichiers .csv
» Fichiers HTML
» dir repertoires et fichiers
»  Exécution des fichiers CPL
» Récapitulatif des utilitaires jjn4

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: