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
» Problème de compilateur.
par Pedro Alvarez Hier à 20:01

» COMPILATEUR V 0.9 beta 8 du 18 aout 2017
par Pedro Alvarez Hier à 19:54

» Pb 17 (en analyse): ITEM_SELECT ne fonctionne pas
par Jack Jeu 17 Aoû 2017 - 19:26

» Compilateur FBPano
par Mike Jeu 17 Aoû 2017 - 13:52

» un nouveau editeur panobasic
par Jean Claude Jeu 17 Aoû 2017 - 10:18

» Le compilateur.
par Pedro Alvarez Jeu 17 Aoû 2017 - 8:36

» Pb 16 (en analyse): ON_CLOSE plante à l'exécution
par Jack Mer 16 Aoû 2017 - 20:00

» Pb 15 (en analyse): TIMER_ON plante à l'exécution
par Jack Mer 16 Aoû 2017 - 19:58

» KGF_dll - nouvelles versions
par Yannick Dim 13 Aoû 2017 - 17:35

» probleme d'outil
par Yannick Dim 13 Aoû 2017 - 17:32

» Carte de France des régions
par Yannick Sam 12 Aoû 2017 - 21:33

» Pb 14 (en analyse): PRINT_LOCATE plante à l'exécution
par Jack Ven 11 Aoû 2017 - 22:37

» Petit avertissement [Mots réservés]
par papydall Ven 11 Aoû 2017 - 13:45

» Distances sur plan
par JL35 Jeu 10 Aoû 2017 - 21:29

» Tracé : Triangle, Carrée, Dents de scie, Sinusoïde redressée
par papydall Jeu 10 Aoû 2017 - 14:52

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Août 2017
LunMarMerJeuVenSamDim
 123456
78910111213
14151617181920
21222324252627
28293031   
CalendrierCalendrier

Partagez | 
 

 Concaténer des fichiers

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
JL35



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

MessageSujet: Concaténer des fichiers   Mar 13 Nov 2012 - 23: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
Voir le sujet précédent Voir le sujet suivant 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 32 bits :: Vos sources, vos utilitaires à partager-
Sauter vers: