JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: 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). | |
|