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
» Demande d'aide sur un programme compilé.
Concaténer des fichiers Emptypar Pedro Aujourd'hui à 15:11

» Figures fractales
Concaténer des fichiers Emptypar jean_debord Aujourd'hui à 10:43

» Réponse souris
Concaténer des fichiers Emptypar Marc Hier à 12:41

» Souris (résolu)
Concaténer des fichiers Emptypar papydall Hier à 5:08

» La Carte du Monde
Concaténer des fichiers Emptypar Marc Dim 30 Juin 2024 - 12:12

» Conversion PSI <=>BAR
Concaténer des fichiers Emptypar Marc Dim 30 Juin 2024 - 12:08

» Yin And Yang
Concaténer des fichiers Emptypar Marc Dim 30 Juin 2024 - 11:54

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Concaténer des fichiers Emptypar papydall Ven 28 Juin 2024 - 23:14

» Naissance de Crocodile Basic
Concaténer des fichiers Emptypar papydall Ven 28 Juin 2024 - 23:11

» Dim et Label
Concaténer des fichiers Emptypar lepetitmarocain Ven 28 Juin 2024 - 10:29

» @lepetitmarocain <==> KGFGrid
Concaténer des fichiers Emptypar lepetitmarocain Ven 28 Juin 2024 - 10:19

» Logithèque : une base de données en Panoramic pour Panoramic
Concaténer des fichiers Emptypar jjn4 Mer 26 Juin 2024 - 18:59

» Salut tout le monde !!
Concaténer des fichiers Emptypar Yannick Mar 25 Juin 2024 - 22:42

» vg5000
Concaténer des fichiers Emptypar Jack Lun 24 Juin 2024 - 18:36

» Récapitulatif des utilitaires jjn4
Concaténer des fichiers Emptypar jjn4 Lun 24 Juin 2024 - 18:26

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juillet 2024
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
293031    
CalendrierCalendrier
Le Deal du moment :
Blue Lock : où acheter le Tome 22 ...
Voir le deal
12 €

 

 Concaténer des fichiers

Aller en bas 
AuteurMessage
JL35




Nombre de messages : 7095
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
-
» Visualisation des fichiers CSV
» Renomme-fichiers
» dir repertoires et fichiers
» Compression de fichiers
» Fichiers flash.

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: