Introduction

Dans une partition de type NTFS (exclusivement), tout fichier peut contenir, en plus des données qui le constituent réellement, plusieurs "flux" d'informations ou "meta-données".
On retrouve ici le concept de fork utilisé dans les fichiers Macintosh.

Cette fonctionnalité est assez peu connue, et rarement employée pour l'instant (un fichier = un flux de données), avant tout pour des questions de compatibilité (partitions NTFS).
En effet, toute copie basique d'un fichier contenant des flux additionnels vers un support non NTFS (partition FAT, gravure de CD, ...) va entraîner la perte totale de ces flux et de leurs contenus respectifs. Seul le flux standard sera conservé.

Une autre raison de cette méconnaissance est due au fait qu'il existe très peu d'outils capables de traiter les informations de ces meta-données.

Les types de flux

On distingue 2 familles de flux en fonction de leurs noms.
Ce nom est une chaîne alphanumérique encadrée par le caractère : et suivie de la chaîne $DATA

:nom_du_flux:$DATA

Quand on manipule un nom de flux (voir plus bas), on omet les caractères : et la chaîne $DATA.

  1. Les flux anonymes
    Le nom (externe) de ces flux est vide, si bien que leur nom (interne) est toujours le même, à savoir ::$DATA
    Par défaut, tout fichier en possède 3 :
    1. Les données du fichier
    2. Un flux descripteur de sécurité, qui n'est autre que la liste de contrôle d'accès (ACL) au fichier.
    3. Un flux d'identificateurs d'objets (je n'ai trouvé de définition tangible à ce sujet, même dans le MSDN) 
       
  2. Les flux nommés
    Ces flux sont identifiés par un nom (externe) non vide, de longueur quelconque
    Par exemple, les informations de Résumé, que l'on peut définir pour n'importe quel fichier, sont stockées dans 3 flux nommés

    Ces informations apparaissent dans l'explorateur quand on survole un fichier :


    Elles sont stockées dans 3 flux nommés :
    Informations résumées : :#5SummaryInformation:$DATA
    Informations sur les propriétés multimédia : :#5SebiesnrMkudrfcoIaamtykdDa:$DATA
    Informations résumées du document : :#5DocumentSummaryInformation:$DATA

    la chaîne #5 représente en réalité le caractère non imprimable 0x05 (CTRL-E)

    De même, si on a demandé l'affichage des miniatures d'un dossier dans l'explorateur, un fichier image (bmp, jpeg, gif, ...) de ce dossier se voit doté d'un flux de nom #5Q30lsldxJoudresxAaaqpcawXc
     

Les flux possèdent également (en interne) un identificateur, qui correspond à leur rôle respectif :

Identificateur
(nom symbolique)
Valeur Rôle
BACKUP_DATA 1 Données standard
BACKUP_EA_DATA 2 Attributs étendus
BACKUP_SECURITY_DATA 3 Descripteur de sécurité
BACKUP_ALTERNATE_DATA 4 Données supplémentaires
BACKUP_LINK 5 Lien symbolique
BACKUP_PROPERTY_DATA 6 Données de propriétés
BACKUP_OBJECT_ID 7 Identificateur d'objets
BACKUP_REPARSE_DATA 8 Point de montage
BACKUP_SPARSE_BLOCK 9 Fichier clairsemé

le préfixe "BACKUP" qui apparaît dans ces noms tient au fait que les outils de sauvegarde (NTBACKUP p.ex.) sur bande magnétique ou sur disque copient également tous les flux.

Un fichier (texte ou autre), pour lequel on a défini un résumé, possèdera donc au moins 6 flux :

Accès standard à un flux nommé depuis Windows

L'accès à un flux nommé s'effectue en donnant le nom du fichier d'origine suivi du caractère : suivi lui-même du nom du flux (sans :$DATA)

Création de flux

On peut créer un flux additionnel (contenant du texte) par exemple à l'aide de la commande echo :

 echo texte  > fichier:flux

Exemple :

C:\>echo La Guerre des Etoiles > d:\Starswar.txt
[...]
C:\>echo May the Force be with You > d:\Starswar.txt:Yoda
C:\>echo You don't know the power of the dark side > d:\Starswar.txt:Vador

On a commencé par créer ici un fichier texte de 24 octets
(22 caractères imprimables, + 2 octets pour les codes Retour chariot/Ligne suivante) :

 

D:\>dir StarsWar.txt
Le volume dans le lecteur D s'appelle W2K-240103
Le numéro de série du volume est 9CAE-D2BB

Répertoire de D:\

26/07/2003 12:39 24 StarsWar.txt
1 fichier(s) 24 octets
0 Rép(s) 399 929 344 octets libres


Puis on a ajouté les flux nommés "Yoda" et "Vador" au fichier texte "Starswar.txt
Mais bien que l'on ait ajouté au fichier 66 caractères sous formes de flux additionnels, on ne voit aucun changement en ce qui concerne sa taille (seule la date du fichier a changé)

[...]
26/07/2003 12:59 24 StarsWar.txt
1 fichier(s) 24 octets
0 Rép(s) 399 912 960 octets libres

C'est du au fait que "dir" (comme la très grande majorité des commandes d'ailleurs) ne sait traiter que les flux anonymes standards.

Affichage de flux

Il existe très peu de moyens standards pour afficher le contenu d'un flux additionnels.
Seule la commande more, avec redirection, permet de le faire :

D:\>more < d:\Starswar.txt:Yoda
May the Force be with You

D:\>more < d:\Starswar.txt:Vador
You don't know the power of the dark side


On peut appliquer cette méthode aux flux relatifs au résumé, mais le résultat n'est guère utilisable, car les textes sont soit au milieu d'informations binaires, et parfois en UNICODE :

D:\>more < d:\Starswar.txt:^ESummaryInformation
(caractères non imprimables)
Yoda et Vador
(caractères non imprimables)
StarsWar
(caractères non imprimables)
George Lucas
(caractères non imprimables)
...

De plus, il n'existe sous Windows (toujours en standard) AUCUN outil capable de donner le nombre et les noms des flux contenus dans un fichier.

La seule occasion où l'on peut prendre connaissance de l'existence de flux additionnels est lors d'une copie du fichier depuis l'explorateur vers une autre partition de type non NTFS :
(dans l'exemple ci-dessous, on a voulu effectuer un "drag-and-drop" vers la partition C:, de type FAT)

Comment accéder aux flux (création, lecture, écriture...) par programmation

On vient de voir que la gestion des flux n'est pas des plus aisées.

Par exemple, il est impossible de copier un fichier dans le flux nommé d'un autre fichier par la commande copy :

D:\>echo essai>test.txt

D:\>copy c:\boot.ini test.txt:boot
Syntaxe du nom de fichier, de répertoire ou de volume incorrecte.
0 fichier(s) copié(s).


Il est cependant possible de le faire à l'aide de l'utilitaire cp.exe, fourni dans le NT Resource Kit de NT4.
Pour une raison inconnue, cet utilitaire a disparu du NT Resource Kit de Windows 2000.
Il fonctionne très bien sous Windows 2000 :

H:\NTRESKIT>cp c:\boot.ini d:\test.txt:boot
c:\boot.ini => d:\test.txt:boot [ok]

H:\NTRESKIT>more <d:\test.txt:boot
[boot loader]
timeout=15
default=multi(0)disk(0)rdisk(1)partition(1)\WINNT
[operating systems]
...

 

Une application (écrite en n'importe quel langage : C, Delphi, Visual Basic,..) capable de gérer les flux devra faire appel aux 3 fonctions suivantes (documentées par Microsoft), qui font partie de la bibliothèque kernel32.dll :

fonction rôle syntaxes
BackupRead Lecture d'un flux à partir d'un fichier déjà ouvert en lecture avec la fonction CreateFile

La fonction retourne une valeur nulle en cas d'échec
C BOOL BackupRead(
   HANDLE hFile,
   LPBYTE lpBuffer,
   DWORD nNumberOfBytesToRead,
   LPDWORD lpNumberOfBytesRead,
   BOOL bAbort,
   BOOL bProcessSecurity,
   LPVOID* lpContext
);
Delphi function BackupRead(
   hFile: THandle;
   lpBuffer: PByte;
   nNumberOfBytesToRead: DWORD;
   var lpNumberOfBytesRead: DWORD;
   bAbort: BOOL;
   bProcessSecurity: BOOL;
   var lpContext: Pointer)
: BOOL; stdcall;
VB Public Declare Function BackupRead Lib "kernel32" _
Alias "BackupRead" ( _
   ByVal hFile As Long, _
    lpBuffer As Byte, _
   ByVal nNumberOfBytesToRead As Long,  _
    lpNumberOfBytesRead As Long, _
   ByVal bAbort As Long, _
   ByVal bProcessSecurity As Long, _
    lpContext As Any) _
As Long
BackupWrite Écriture d'un flux à partir d'un fichier déjà ouvert en écriture avec la fonction CreateFile

La fonction retourne une valeur nulle en cas d'échec
C BOOL BackupWrite(
   HANDLE hFile,
   LPBYTE lpBuffer,
   DWORD nNumberOfBytesToWrite,
   LPDWORD lpNumberOfBytesWritten,
   BOOL bAbort,
   BOOL bProcessSecurity,
   LPVOID* lpContext
);
Delphi function BackupWrite(
   hFile: THandle;
   lpBuffer: PByte;
   nNumberOfBytesToWrite: DWORD;
   var lpNumberOfBytesWritten: DWORD;
   bAbort,
   bProcessSecurity: BOOL;
   var lpContext: Pointer)
: BOOL; stdcall;
VB Public Declare Function BackupWrite Lib "kernel32" _
Alias "BackupWrite" ( _
   ByVal hFile As Long, _
   lpBuffer As Byte, _
   ByVal nNumberOfBytesToWrite As Long, _
   lpNumberOfBytesWritten As Long, _
   ByVal bAbort As Long, _
   ByVal bProcessSecurity As Long, _
   lpContext As Long) _
As Long
BackupSeek Positionnement à un emplacement précis dans le fichier.
Sert aussi à atteindre le flux suivant.

La fonction retourne une valeur nulle en cas d'échec
C BOOL BackupSeek(
   HANDLE hFile,
   DWORD dwLowBytesToSeek,
   DWORD dwHighBytesToSeek,
   LPDWORD lpdwLowByteSeeked,
   LPDWORD lpdwHighByteSeeked,
   LPVOID* lpContext
);
Delphi function BackupSeek(
   hFile: THandle;
   dwLowBytesToSeek,
   dwHighBytesToSeek: DWORD;
   var lpdwLowByteSeeked,
   lpdwHighByteSeeked: DWORD;
   lpContext: Pointer)
: BOOL; stdcall;
VB Public Declare Function BackupSeek Lib "kernel32" _
Alias "BackupSeek" ( _
   ByVal hFile As Long, _
   ByVal dwLowBytesToSeek As Long, _
   ByVal dwHighBytesToSeek As Long, _
    lpdwLowByteSeeked As Long, _
    lpdwHighByteSeeked As Long, _
    lpContext As Long) _
As Long

L'application devra également faire appel aux fonctions habituelles d'ouverture et fermeture de fichier, contenues également dans kernel32.dll :

fonction rôle syntaxes
CreateFile Création ou ouverture d'un fichier, dossier, ...

La fonction retourne le handle en cas de succès, ou la valeur INVALID_HANDLE_VALUE en cas d'échec
C HANDLE CreateFile(
   LPCTSTR lpFileName,
   DWORD dwDesiredAccess,
   DWORD dwShareMode,
   LPSECURITY_ATTRIBUTES lpSecurityAttributes,
   DWORD dwCreationDisposition,
   DWORD dwFlagsAndAttributes,
   HANDLE hTemplateFile
);
Delphi function CreateFile(
   lpFileName: PChar;
   dwDesiredAccess,
   dwShareMode: DWORD;
   lpSecurityAttributes: PSecurityAttributes;
   dwCreationDisposition,
   dwFlagsAndAttributes: DWORD;
   hTemplateFile: THandle)
: THandle; stdcall;
VB Public Declare Function CreateFile Lib "kernel32" _
Alias "CreateFileA" ( _
   ByVal lpFileName As String, _
   ByVal dwDesiredAccess As Long, _
   ByVal dwShareMode As Long, _
   lpSecurityAttributes As SECURITY_ATTRIBUTES, _
   ByVal dwCreationDisposition As Long, _
   ByVal dwFlagsAndAttributes As Long, _
   ByVal hTemplateFile As Long) _
As Long
CloseHandle Fermeture d'un fichier, dossier, ... ouvert avec CreateFile

La fonction retourne une valeur nulle en cas d'échec
C BOOL CloseHandle(
   HANDLE hObject
);
Delphi function CloseHandle(
   hObject: THandle)
: BOOL; stdcall;
VB Public Declare Function CloseHandle Lib "kernel32" _
Alias "CloseHandle" ( _
   ByVal hObject As Long) _
As Long

Structures

WIN32_STREAM_ID Structure d'identifiant de flux C typedef struct _WIN32_STREAM_ID {
   DWORD dwStreamId;
   DWORD dwStreamAttributes;
   LARGE_INTEGER Size;
   DWORD dwStreamNameSize;
   WCHAR cStreamName[ANYSIZE_ARRAY];
} WIN32_STREAM_ID, *LPWIN32_STREAM_ID;
Delphi _WIN32_STREAM_ID = record
   dwStreamId: DWORD;
   dwStreamAttributes: DWORD;
   Size: TLargeInteger;
   dwStreamNameSize: DWORD;
   cStreamName: array[0..0] of WCHAR;
end;
VB Public Type WIN32_STREAM_ID
    dwStreamId
As Long
   dwStreamAttributes As Long
   dwStreamSizeLow As Long
   dwStreamSizeHigh As Long
   dwStreamNameSize As Long
   cStreamName As Byte
End Type
SECURITY_ATTRIBUTES Structure contenant un descripteur de sécurité C typedef struct _SECURITY_ATTRIBUTES {
   DWORD nLength;
   LPVOID lpSecurityDescriptor;
   BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;
Delphi _SECURITY_ATTRIBUTES = record
   nLength: DWORD;
   lpSecurityDescriptor: Pointer;
   bInheritHandle: BOOL;
end;
VB Public Type SECURITY_ATTRIBUTES
   nLength As Long
   lpSecurityDescriptor As Long
   bInheritHandle As Long
End Type

Ces fonctions backupread, backupwrite et backupseek sont utilisées par exemple par l'outil de sauvegarde / restauration NTBACKUP.EXE, lequel conserve l'intégralité des meta-données de flux.

Paramètres transmis :

Nom rôle valeurs
hFile handle pointant vers un fichier ou dossier.
Il est obtenu par appel de la fonction CreateFile
 
lpBuffer pointeur vers un buffer recevant (lecture) ou contenant (écriture) les données  
nNumberOfBytesToRead taille du buffer à lire en octets. Doit être supérieure ou égale à la taille de la structure WIN32_STREAM_ID  
lpNumberOfBytesRead pointeur vers une variable recevant le nombre d'octets lus  
nNumberOfBytesToWrite taille du buffer à écrire en octets. Doit être supérieure ou égale à la taille de la structure WIN32_STREAM_ID  
lpNumberOfBytesWritten pointeur vers une variable recevant le nombre d'octets écrits  
dwLowBytesToSeek partie basse du nombre d'octets à atteindre valeur maximum possible afin d'atteindre le flux suivant
dwHighBytesToSeek partie haute du nombre d'octets à atteindre valeur maximum possible afin d'atteindre le flux suivant
lpdwLowByteSeeked partie basse du nombre d'octets atteints  
lpdwHighByteSeeked partie haute du nombre d'octets atteints  
bAbort indicateur de fin de lecture ou écriture du flux false, puis true pour terminer
bProcessSecurity indicateur de copie de la liste de contrôle d'accès (ACL) true
lpContext pointeur vers une variable qui reçoit un pointeur interne aux fonctions backup null / nil / 0 avant le 1er appel, et ne doit pas être modifié ensuite
 
lpFileName pointeur vers une chaîne ASCIIZ contenant le nom du fichier du dossier  
dwDesiredAccess type d'accès au fichier
 
en lecture :
   GENERIC_READ
en écriture :
   GENERIC_WRITE or WRITE_OWNER or WRITE_DAC
dwShareMode mode de partage du fichier
 
en lecture :
   FILE_SHARE_READ
en écriture :
   FILE_SHARE_WRITE
lpSecurityAttributes pointeur vers une structure SECURITY_ATTRIBUTES null / nil / 0
dwCreationDisposition action à entreprendre suivant l'existence du fichier en lecture :
   OPEN_EXISTING
en écriture :
   CREATE_ALWAYS
dwFlagsAndAttributes attributs du fichier FILE_FLAG_BACKUP_SEMANTICS
hTemplateFile handle vers un fichier modèle null / 0 / 0
 
dwStreamId type de flux
BACKUP_DATA Données standard
BACKUP_EA_DATA Attributs étendus
BACKUP_SECURITY_DATA Descripteur de sécurité
BACKUP_ALTERNATE_DATA Flux de données supplémentaires
BACKUP_LINK Lien symbolique
BACKUP_PROPERTY_DATA Données de propriétés
BACKUP_OBJECT_ID Identificateurs d'objets
BACKUP_REPARSE_DATA Points de montage
BACKUP_SPARSE_BLOCK Fichier clairsemé.

dwStreamAttributes

attributs supplémentaires de flux
STREAM_MODIFIED_WHEN_READ Le flux contient des données modifiées par la lecture
STREAM_CONTAINS_SECURITY Le flux contient des données de sécurité
Size
ou (en VB)

dwStreamSizeLow
dwStreamSizeHigh
taille des données en octets  
dwStreamNameSize longueur du nom du flux (cas de flux nommés)  
cStreamName chaîne UNICODE contenant le nom du flux  

Principe d'utilisation

Outils externes

Comme cela a déjà été évoqué plus haut, il existe très peu d'outils capables de gérer les flux.
On peut recenser :

Outils JCB

Devant cette rareté d'outils, et la pauvreté des fonctionnalités des outils existants, j'ai écrit 2 logiciels :

ShowStream

Il se présente sous la forme d'une boite de dialogue à 4 onglets :

Nom Aspect Fonctions
Recherche de flux Effectue une recherche dans le dossier spécifié de tous les fichiers contenant des flux nommés.
La partition sélectionnée doit être de type NTFS

 

 


La recherche peut être récursive. (exploration des sous-dossiers)
(On peut aussi rechercher tous les fichiers)

 

La liste résultat peut être enregistrée dans un fichier texte (avec tabulations) pouvant être ouvert sous Excel

Analyse de flux Analyse un fichier (de type quelconque) et indique combien il comporte de flux, nommés ou non.
La partition du fichier à analyser doit être de type NTFS

La liste des flux est affichée, avec respectivement :
- leurs noms (le suffixe :$DATA est omis)
- leurs types
- des indicateurs éventuels
- leur taille en octets

 

 

 

Le contenu hexadécimal du flux sélectionné dans la liste précédente est affiché.

 


On peut exporter le contenu du flux sélectionné dans un fichier quelconque (un nom par défaut est suggéré).

On peut aussi exporter l'intégralité des flux dans un fichier "cabinet" (extension .cab), sur une partition de type quelconque, en vue d'une fusion ultérieure.

Fusion de flux Reconstitue un fichier avec l'intégralité de ses flux à partir d'un fichier cabinet (.cab) précédemment généré.

Il est possible d'ajouter au fichier qui sera reconstitué un flux supplémentaire nommé, à partir d'un fichier quelconque et d'un nom de flux arbitraire.

Le fichier qui sera reconstitué doit appartenir à une partition de type NTFS

On peut décider de ne pas incorporer certains flux nommés, en décochant les cases associées.

 

 


Un journal des opérations est affiché, avec remarques ou messages d'erreur éventuels.

A propos Affiche la version du logiciel ainsi qu'un un aide-mémoire.

CmdStream

C'est une application en mode console (sans interface), destinée à être utilisée essentiellement dans un fichier de commandes (.bat ou .cmd).
Elle est entièrement compatible avec ShowStream.

Elle est destinée à :

Syntaxe :
  CmdStream [/v] <commande> <fichier> [<dossier>]

Paramètres :
  /v : Spécifie que CMDSTREAM doit être exécuté en mode bavard (facultatif)

  <commande> :
  /e : Extraction des flux d'un fichier quelconque qui seront
       stockés dans un nouveau fichier cabinet (extension .cab)
  /r : Recréation d'un fichier et de ses flux à partir
       d'un fichier cabinet.

  <fichier> :
       (/e) : Nom d'un fichier dont on doit extraire les flux.
              La partition de ce fichier doit être de type NTFS.
       (/r) : Nom d'un fichier cabinet (extension .cab) généré précédemment
              à l'aide des programmes "CmdStream" ou "ShowStream".

  <dossier> :
       (/e) : Nom du dossier recevant le fichier cabinet.
              Ce dossier sera créé s'il n'existe pas.
       (/r) : Nom du dossier recevant le fichier à reconstituer.
              La partition de ce dossier doit être de type NTFS.
              Ce dossier sera créé s'il n'existe pas.
  Si <dossier> est omis, le logiciel se limite alors à afficher :
       (/e) : les noms des flux contenus dans le fichier.
       (/r) : les noms des fichiers contenus dans le fichier cabinet.
 

Exemples :

Extraction des flux d'un fichier et création de fichier cabinet :

H:\JCBtools>CmdStream /v /e d:\StarsWar.txt c:\test
Dossier c:\test\ créé
+---+-----------------------------------------+--------------+----------+-----+
| N°|Nom du flux                              |Type de flux  | Taille   |Attr.|
+---+-----------------------------------------+--------------+----------+-----+
|  1|(sans nom)                               |SECURITY_DATA |       140| S   |
|  2|(sans nom)                               |DATA          |        23|     |
|  3|#5DocumentSummaryInformation             |ALTERNATE_DATA|       120|     |
|  4|#5SebiesnrMkudrfcoIaamtykdDa             |ALTERNATE_DATA|       192|     |
|  5|#5SummaryInformation                     |ALTERNATE_DATA|       260|     |
|  6|movies                                   |ALTERNATE_DATA|        23|     |
|  7|Vador                                    |ALTERNATE_DATA|        44|    
...
Le fichier d:\StarsWar.txt contient 7 flux nommé(s)
Création fichier cabinet c:\test\StarsWar.txt.cab
Création des fichiers temporaires :
 c:\test\StarsWar.txt_SECURITY_DATA.001
 c:\test\StarsWar.txt_SECURITY_DATA.001.hdr
...
Exportation totale réalisée dans un fichier cabinet c:\test\StarsWar.txt.cab
Suppression des fichiers temporaires :
 c:\test\StarsWar.txt_SECURITY_DATA.001
 c:\test\StarsWar.txt_SECURITY_DATA.001.hdr
...


Extraction des flux de tous les fichiers .txt d'un dossier et création des fichiers cabinets correspondants :

H:\JCBtools>for %F in (d:\*.txt) do CmdStream /e c:\dirtest

H:\JCBtools>CmdStream /e d:\cipher.txt c:\dirtest
H:\JCBtools>CmdStream /e d:\date.txt c:\dirtest
H:\JCBtools>CmdStream /e d:\dumpip.txt c:\dirtest
H:\JCBtools>CmdStream /e d:\gpresult.txt c:\dirtest
...
H:\JCBtools>CmdStream /e d:\listproc.txt c:\dirtest
H:\JCBtools>CmdStream /e d:\StarsWar.txt c:\dirtest
...

 
Liste des flux d'un fichier :

H:\JCBtools>CmdStream /e d:\StarsWar.txt
+---+-----------------------------------------+--------------+----------+-----+
| N°|Nom du flux                              |Type de flux  | Taille   |Attr.|
+---+-----------------------------------------+--------------+----------+-----+
|  1|(sans nom)                               |SECURITY_DATA |       140| S   |
|  2|(sans nom)                               |DATA          |        23|     |
|  3|#5DocumentSummaryInformation             |ALTERNATE_DATA|       120|     |
|  4|#5SebiesnrMkudrfcoIaamtykdDa             |ALTERNATE_DATA|       192|     |
|  5|#5SummaryInformation                     |ALTERNATE_DATA|       260|     |
|  6|movies                                   |ALTERNATE_DATA|        23|     |
|  7|Vador                                    |ALTERNATE_DATA|        44|     |
|  8|Yoda                                     |ALTERNATE_DATA|        28|     |
|  9|{4c8cc155-6c1e-11d1-8e41-00c04fb9386d}   |ALTERNATE_DATA|         0|     |
| 10|(sans nom)                               |OBJECT_ID     |        64|     |
+---+-----------------------------------------+--------------+----------+-----+
Légende :
 R : Les données sont modifiées par la lecture
 S : Le flux contient des informations de sécurité

Le fichier d:\StarsWar.txt contient 7 flux nommé(s)


Recréation d'un fichier et de ses flux à partir d'un fichier cabinet :

H:\JCBtools>CmdStream /v /r C:\test\StarsWar.txt.cab d:\teststream
Fichier initial :StarsWar.txt contenant 10 flux
+---+-----------------------------------------+--------------+
| N°|Nom du flux                              |Type de flux  |
+---+-----------------------------------------+--------------+
| 1|(sans nom)                                |SECURITY_DATA |
| 2|(sans nom)                                |DATA          |
| 3|#5DocumentSummaryInformation              |ALTERNATE_DATA|
| 4|#5SebiesnrMkudrfcoIaamtykdDa              |ALTERNATE_DATA|
| 5|#5SummaryInformation                      |ALTERNATE_DATA|
| 6|movies                                    |ALTERNATE_DATA|
| 7|Vador                                     |ALTERNATE_DATA|
| 8|Yoda                                      |ALTERNATE_DATA|
| 9|{4c8cc155-6c1e-11d1-8e41-00c04fb9386d}    |ALTERNATE_DATA|
| 10|(sans nom)                               |OBJECT_ID     |
+---+-----------------------------------------+--------------+
Fusion flux n°  1 OK
Fusion flux n°  2 OK
...
Fusion flux n° 10 OK
Fusion opérée dans le fichier d:\teststream\StarsWar.txt


Recréation des fichiers et de leurs flux à partir de tous les fichiers cabinets d'un dossier :

H:\JCBtools>for %F in (c:\dirtest\*.cab) do CmdStream /r %F h:\streamstxt

H:\JCBtools>CmdStream /r c:\dirtest\gpresult.txt.cab h:\streamstxt
H:\JCBtools>CmdStream /r c:\dirtest\listproc.txt.cab h:\streamstxt
...
H:\JCBtools>CmdStream /r c:\dirtest\cipher.txt.cab h:\streamstxt
H:\JCBtools>CmdStream /r c:\dirtest\date.txt.cab h:\streamstxt
H:\JCBtools>CmdStream /r c:\dirtest\dumpip.txt.cab h:\streamstxt
H:\JCBtools>CmdStream /r c:\dirtest\StarsWar.txt.cab h:\streamstxt
...


Liste des fichiers contenus dans un fichier cabinet :

H:\JCBtools>CmdStream /r C:\test\StarsWar.txt.cab
Fichier d'origine "StarsWar.txt" contenant 10 flux :
  1 : SECURITY_DATA
  2 : DATA
  3 : ALTERNATE_DATA
  4 : ALTERNATE_DATA
  5 : ALTERNATE_DATA
  6 : ALTERNATE_DATA
  7 : ALTERNATE_DATA
  8 : ALTERNATE_DATA
  9 : ALTERNATE_DATA
 10 : OBJECT_ID

Téléchargements

Téléchargement de streams.zip (530 ko) contenant :

Après décompression, aucune installation n'est à effectuer, les programmes sont directement utilisables (sous un compte administrateur).

L'utilisation de ces logiciels est libre et gratuite, sous réserve de respecter le copyright.