Page 1 sur 1

Chargement des fichiers ISO CD (c'est le debut).

Publié : mer. 20/mars/2013 14:29
par GallyHC
Bonjour,

Je viens de commencer une source pour le chargement des fichiers de type ISO (pour le moment c'est la détection du type et le nom de CD).

Je continu mes recherches sur la structure des fichiers ISO car avec tout les protocoles différents, il y a du boulot :). Donc voila la première partie du code et espèrent rapidement mettre le listage des fichier :).

Code : Tout sélectionner

; +======================================================+
; |   ISO CD FILE LOADER (Réalisation par KoakDesign)    |
; +------------------------------------------------------+
; | COPYRIGHT(C)2007-2008, ALL RIGHT RESERVED KOAKDESIGN |
; +--------------+---------------------------------------+
; | Program type | PUREBASIC 5.10                        |
; +--------------+---------------------------------------+
; | VER & REV    | 0.0.1                                 |
; +--------------+---------------------------------------+
; | Program name | iso_file.pb                           |
; +======================================================+

; +======================================================+
; | Original Version: 0.0.1                              |
; +--------------+---------------------------------------+
; | Created by   | GallyHomeCorp                         |
; | Graphix by   |                                       |
; +--------------+---------------------------------------+
; | Comments:    |                                       |
; +--------------+                                       |
; |                                                      |
; |                                                      |
; |                                                      |
; +======================================================+

; +======================================================+
; | Système d'Exploitation                               |
; +--------------+---------------------------------------+
; | Window       | Oui                                   |
; | Linux        | Oui                                   |
; | MacOS        | Oui                                   |
; +======================================================+

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

EnableExplicit

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

#CDFS_SIZE_2048       = 2048
;#CDFS_SIZE_2336       = 2336

#VSD_STD_ID_CD001     = "CD001" ; (* STANDARD ID *)
#VSD_STD_ID_NSR02     = "NSR02" ; (* (3/9.1)     * Standard Identifier)
#VSD_STD_ID_NSR03     = "NSR03" ; (* (3/9.1)     *)
#VSD_STD_ID_BEA01     = "BEA01" ; (* (2/9.2)     *)
#VSD_STD_ID_TEA01     = "TEA01" ; (* (2/9.3)     *)
#VSD_STD_ID_BOOT2     = "BOOT2" ; (* (2/9.4)     *)
#VSD_STD_ID_CD001     = "CD001" ; (* (ECMA-119)  *)
#VSD_STD_ID_CDW02     = "CDW02" ; (* (ECMA-168)  *)

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Structure FILE_DIRECTORY_DATE_TIME
  year.a
  month.a
  day.a
  hour.a
  minute.a
  second.a
  gmtoffset.a
EndStructure

Structure PRIMARY_ROOT_DATE_TIME
  year.l
  month.a
  day.a
  hour.a
  minute.a
  second.a
  Hundredths.l
  gmtoffset.l
EndStructure

Structure ROOT_DIRECTORY_RECORD
  LengthOfDirectoryRecord.a
  ExtendedAttributeRecordLength.a
  LocationOfExtent.q
  DataLength.q
  RecordingDateAndTime.FILE_DIRECTORY_DATE_TIME
  FileFlags.a
  FileUnitSize.a
  InterleaveGapSize.a
  VolumeSequenceNumber.l
  LengthOfFileIdentifier.a
  FileIdentifier.a
EndStructure

Structure PRIMARY_VOLUME_DESCRIPTOR
  StandardType.a
  StandardIdentifier.s{5}
  VolumeDescriptorVersion.a
  Unused1.a
  SystemIdentifier.s{32}
  VolumeIdentifier.s{32}
  Unused2.b[8]
  VolumeSpaceSize.q
  EscapeSequences.s{32}
  VolumeSetSize.l
  VolumeSequenceNumber.l
  LogicalBlockSize.l
  PathTableSize.q
  LocationOfTypeLPathTable.l
  LocationOfOptionalTypeLPathTable.l
  LocationOfTypeMPathTable.l
  LocationOfOptionalTypeMPathTable.l
  LocationDirectoryEntryRoot.ROOT_DIRECTORY_RECORD
  VolumeSetIdentifier.s{128}
  PublisherIdentifier.s{128}
  DataPreparerIdentifier.s{128}
  ApplicationIdentifier.s{128}
  CopyrightFileIdentifier.s{37}
  AbstractFileIdentifier.s{37}
  BibliographicFileIdentifier.s{37}
  VolumeCreatedTimeDate.PRIMARY_ROOT_DATE_TIME
  VolumeMidifiedTimeDate.PRIMARY_ROOT_DATE_TIME
  VolumeExpiratedTimeDate.PRIMARY_ROOT_DATE_TIME
  VolumeEffectiveTimeDate.PRIMARY_ROOT_DATE_TIME
  FilestructureVersion.a
  Unused3.a
  ApplicationUsed.s{512}
  Reserved.a[653]
EndStructure

Structure FILE_DIRECTORY_DESCRIPTORS
  DirectoryLenRecord.a
  ExtendedAttributeRecordLen.a
  LocationofExtent.q
  DataLength.q
  RecordingDateTime.FILE_DIRECTORY_DATE_TIME
  FileFlags.a
  FileUnitSize.a
  InterleaveGapSize.a
  VolumeSequenceNumber.l
  LengthofFileIdentifier.a
  FileIdentifier.a
EndStructure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Define i.i
Define j.i
Define ifile.i
Define iflen.i
Define iseek.i
Define itemp.i
Define atemp.a
Define btemp.b
Define stemp.s

Define szfile.s = "fileiso_0.iso"

Define pvdescriptor.PRIMARY_VOLUME_DESCRIPTOR
Define fldescriptor.FILE_DIRECTORY_DESCRIPTORS

ifile = ReadFile(#PB_Any, szfile)
If ifile
  iflen = Lof(ifile)
  
  ; LES 16 PREMIERS SECTEURS SONT A VIDE. 
  ; 1 SECTEUR = 2048 PAQUETS DONC DEPLACEMENT DE "16 x 2048".
  iseek = 16 * #CDFS_SIZE_2048
  FileSeek(ifile, iseek)

  ; LECTURE DU PREMIER BLOCK D'INFORMATION.
  ; ON DOIT AVOIR "CD001" DANS LA VARIABLE "STANDADIDENTIFIER".
  ReadData(ifile, pvdescriptor,   SizeOf(PRIMARY_VOLUME_DESCRIPTOR))

  ; PASSAGE DES DIVERS TAGS DU FICHIER.
  ; AU MINIMUM IL Y A DEUX TAGS "CD001" DANS LES FICHIERS ISO.
  Debug "RECHERCHE DES TAGS :"
  Debug #NULL$
  btemp = #False
  Repeat
    atemp = ReadByte(ifile)
    stemp = ReadString(ifile, #PB_Ascii, 5)
    If stemp <> #NULL$
      i + 1
      If atemp <> 255
        Debug Str(i) + " : " + stemp + " : " + Str(atemp) 
      Else
        Debug Str(i) + " : " + stemp + " : " + Str(atemp) + " : FIN DE TAG CD001"
      EndIf
      Select stemp
        Case #VSD_STD_ID_CD001
          iseek + #CDFS_SIZE_2048
          FileSeek(ifile, iseek)
        Case #VSD_STD_ID_NSR02
          iseek + #CDFS_SIZE_2048
          FileSeek(ifile, iseek)
        Case #VSD_STD_ID_NSR03
          iseek + #CDFS_SIZE_2048
          FileSeek(ifile, iseek)
        Case #VSD_STD_ID_BEA01
          iseek + #CDFS_SIZE_2048
          FileSeek(ifile, iseek)
        Case #VSD_STD_ID_BOOT2
          iseek + #CDFS_SIZE_2048
          FileSeek(ifile, iseek)
        Case #VSD_STD_ID_CDW02
          iseek + #CDFS_SIZE_2048
          FileSeek(ifile, iseek)
        Case #VSD_STD_ID_TEA01
          iseek + (11* #CDFS_SIZE_2048)
          FileSeek(ifile, iseek)
        Default
          btemp = #True
      EndSelect
    Else
      btemp = #True
      FileSeek(ifile, iseek)
    EndIf
  Until btemp = #True  
  ; ON RECHERCHE LE PREMIER FICHIER DE L'ISO.
  ; PREMIER BIT DOIT AVOIR 34 ($22) POUR ETRE PREMIER FICHIER.
  Repeat
    i + 1
    atemp = ReadByte(ifile)
    If atemp <> 34
      iseek + #CDFS_SIZE_2048
      FileSeek(ifile, iseek)
    Else
      FileSeek(ifile, iseek)
    EndIf
  Until atemp = 34
  
  Debug #NULL$
  Debug "-----------------------"
  Debug "PREMIER FICHIER A : " + Str(Loc(ifile)) + " ($"+ Hex(Loc(ifile)) + ")"
  Debug Str(i) + " : " + Str(atemp)

  ; LE PREMIER FICHIER OU REPERTOIRE EST :
  ; LIRE A PARTIR DE l'OCTET 101 EN MEMOIRE.
  Debug #NULL$
  Debug "-----------------------"
  Debug "PREMIER FICHIER OU REPERTOIRE :"  
  ReadData(ifile, fldescriptor,   SizeOf(FILE_DIRECTORY_DESCRIPTORS))  
  
  CloseFile(ifile)
  
  ;
  ; NETOYAGE DES INFORMATIONS.
  ;
  pvdescriptor\VolumeIdentifier     = RTrim(pvdescriptor\VolumeIdentifier)
  pvdescriptor\VolumeSetIdentifier  = RTrim(pvdescriptor\VolumeSetIdentifier)
  ;
  ; NETOYAGE DES INFORMATIONS.
  ;
  
  Debug #NULL$
  Debug "-----------------------"
  Debug "INFORMATION DU CD :"
  Debug #NULL$
  Debug "VOLUME NAME : " + pvdescriptor\VolumeIdentifier
  Debug "DATA IDENTIFIER : " + pvdescriptor\DataPreparerIdentifier
  Debug #NULL$
  Debug "-----------------------"
  Debug #NULL$
  If pvdescriptor\StandardType = 1 And pvdescriptor\StandardIdentifier = #VSD_STD_ID_CD001
    Debug "ISO FILE IS OK"  
  EndIf
EndIf
Cordialement,
GallyHC

Re: Chargement des fichiers ISO (c'est le debut).

Publié : mer. 20/mars/2013 16:46
par graph100
Un beau projet à réaliser en PB !

Je suivrais avec attention :D

Re: Chargement des fichiers ISO (c'est le debut).

Publié : mer. 20/mars/2013 17:06
par falsam
graph100 a écrit :Un beau projet à réaliser en PB ! Je suivrais avec attention :D
+1

Re: Chargement des fichiers ISO (c'est le debut).

Publié : jeu. 21/mars/2013 0:37
par GallyHC
Bonjour,

Petite évolution du code enfin pas encore grand chose, juste le nom du premier fichier ou répertoire du CD et correction de code :). Mise à jour dans le premier post.

Cordialement,
GallyHC

Re: Chargement des fichiers ISO CD (c'est le debut).

Publié : jeu. 21/mars/2013 6:07
par graph100
Si tu as besoin de test, je peux te faire un petit retour d'expérience (peut-être quand le code sera un peu plus avancé)

:D

Prends-tu aussi en compte les ISO de DVD ? Je ne sais pas si c'est le même standard et ça m'étonnerais.

Re: Chargement des fichiers ISO CD (c'est le debut).

Publié : jeu. 21/mars/2013 10:37
par GallyHC
Bonjour,

graph100> Pour le moment je ne vois que pour les CD, histoire de ne pas trop me pollué de plein de trucs inutile :). Après je verrais si cela est facilement modifiable (mais je penses qui a quelque similitude).

Cordialement,
GallyHC

Re: Chargement des fichiers ISO CD (c'est le debut).

Publié : ven. 22/mars/2013 23:55
par GallyHC
Bonjour,

Version un peu épurer, je recherche le listage des fichiers.

Cordialement,
GallyHC