FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» quel est ce comportement de Panoramic_editor
par Klaus Aujourd'hui à 18:30

» Découpe dans une image
par Jean Claude Aujourd'hui à 18:15

» bug BORDER_HIDE : bloque la commande full_space
par silverman Aujourd'hui à 1:19

» FNC IsDateValide(d$) pour vérifier la validité d'une date
par papydall Hier à 18:57

» Pour faire plaisir à jjn4.
par Pedro Alvarez Hier à 8:13

» Pour faire plaisir à Marc37.
par Marc Jeu 22 Fév 2018 - 21:46

» Couleur d'une variable qui n'est pas un mot-clé
par bignono Jeu 22 Fév 2018 - 14:03

» Un catalogue de photos de fleurs, avec KBDD, affichage HTML
par Klaus Mer 21 Fév 2018 - 22:44

» KGF_dll - nouvelles versions
par Klaus Mer 21 Fév 2018 - 22:30

» Mah-Jong anglais
par jjn4 Mer 21 Fév 2018 - 14:22

» Partie fractionnaire d'un flottant
par silverman Mer 21 Fév 2018 - 14:19

» bug CREATE_HIDE : corruption de form
par silverman Mer 21 Fév 2018 - 13:32

» Racine carrée d’un nombre par l’algorithme de Héron
par Ouf_ca_passe Mer 21 Fév 2018 - 9:52

» Méthode manuelle d'extraction de la racine carrée
par pascal10000 Mer 21 Fév 2018 - 7:47

» [annulé]ON_MOVE n,l ne fonctionne que sur le form 0
par silverman Mar 20 Fév 2018 - 16:52

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Février 2018
LunMarMerJeuVenSamDim
   1234
567891011
12131415161718
19202122232425
262728    
CalendrierCalendrier

Partagez | 
 

 Concaténer des fichiers

Aller en bas 
AuteurMessage
JL35



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

MessageSujet: Concaténer des fichiers   Mar 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
Voir le profil de l'utilisateur
 
Concaténer des fichiers
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Hébergement gratuit images photos fichiers
» [Résolu] OE6 : restaurer fichiers .dbx supprimés
» [Résolu] classement des fichiers et dossiers
» Mapsource refuse les fichiers GPX nouvellement créés
» Fichiers .bmp dans POI

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: