Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CRÉATION D'UN FICHIER AUTOEXTRACTIBLE


Information sur la source

Catégorie :Fichier / Disque Source .NET ( DotNet ) Classé sous : autoextractible, fichier, copier, octets, dossier Niveau : Initié Date de création : 29/10/2006 Date de mise à jour : 04/11/2006 16:08:58 Vu / téléchargé: 8 927 / 851

Note :
9,25 / 10 - par 4 personnes
9,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Cette source a pour but de montrer comment créer un fichier autoextractible contenant plusieurs fichiers.

Pour voir son fonctionnement :
1 - Ouvrer SaveData.sln
2 - Creer SaveData.exe
3 - Lancez le

Explication du programme de sauvegarde :
1 - Copie du fichier RestoreData.dat (qui est en fait l'exe du projet de restauration) dans le repertoire cible sous le nom donné par l'utilisateur
2 - Boucle qui parcours les fichiers du répertoire source
3 - Ecriture dans le fichier Xml de sortie (contient les infos de chaques fichiers nécéssaires à l'extraction)
4 - Ecriture de chaque fichier à la suite du fichier de sortie qui contient déjà RestoreData (40Ko ca va ;))
5 - Fin de la boucle

Note : Pour refaire RestoreData.dat, créez l'éxecutable du projet de restauration puis renommez le en .dat et enfin copiez le dans le répertoire de l'éxecutable de sauvegarde.

Explication du programme de restauration:
1 - Execution du fichier de Restauration créé précédemment
2 - Boucle qui parcours le fichier Xml et décrypte toutes ses infos
3 - Ecriture de chaque fichier à l'emplacement d'origine
4 - Fin de la boucle

Source très commenté.



 

Source

  • Option Strict On
  • Module ModSave
  • Friend PourCent As Integer = 0 'Avancement total
  • Friend PourCentInFile As Integer = 0 'Avancement du fichier
  • Friend CurrentPath As String = "" 'Fichier courant
  • Friend NewThread As Threading.Thread 'Déclaration du Thread
  • Friend BytesWrite As Long = 0 'Octets écrits
  • Friend Source, Destination, Nom As String 'Source, Destination et Nom
  • Friend Sub StartSave()
  • 'Démarrage du Thread
  • NewThread = New Threading.Thread(AddressOf StartThread)
  • NewThread.Start()
  • End Sub
  • Private Sub StartThread()
  • 'Procédure du démarrage du Thread
  • SaveDir()
  • End
  • End Sub
  • Public Sub SaveDir()
  • Try
  • 'On initie les valeurs
  • PourCent = 0
  • PourCentInFile = 0
  • Dim CurrentFile As IO.FileStream 'Fichier courant qui va être lu
  • Dim CurrentFileInfo As IO.FileInfo 'Infos sur le fichier qui va être lu
  • Dim BytesStep As Integer = 1024 * 512 'Nombre d'octets à lire à la fois
  • Dim Bytes(BytesStep) As Byte 'Le tableau de bytes
  • Dim BytesRead As Integer 'Octets lus dans le flux
  • Dim PathFile As String = "" 'Chemin du fichier
  • Dim DirOfPathFile As String = "" 'Chemin du répertoire du fichier
  • 'On créé une liste de tous les fichiers
  • Dim TblFiles() As String
  • TblFiles = IO.Directory.GetFiles(Source, "*.*", IO.SearchOption.AllDirectories)
  • 'On créé le répertoire de la sauvegarde s'il n'existe pas
  • If IO.Directory.Exists(Destination & "\" & Nom) = False Then IO.Directory.CreateDirectory(Destination & "\" & Nom)
  • 'On copie le projet Exe de restauration si le fichier cible n'exite pas
  • IO.File.Copy(Application.StartupPath & "\RestoreData.dat", Destination & "\" & Nom & "\" & Nom & ".exe", True)
  • 'On ouvre un nouveau flux dans le fichier cible après l'Exe servant au déchiffrage
  • Dim FileCible As New IO.FileStream(Destination & "\" & Nom & "\" & Nom & ".exe", IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.ReadWrite, BytesStep)
  • 'On met la position du flux à la fin des données du programme de restauration du fichier cible
  • Dim InfoFileRestore As New IO.FileInfo(Application.StartupPath & "\RestoreData.dat")
  • 'Creation du début des données du fichier Xml contenant toutes les données nécéssaires au déchiffrage
  • Dim DataFileXml As String = ""
  • DataFileXml = "<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "utf-8" & Chr(34) & "?>"
  • DataFileXml &= "<Structure>"
  • 'On sauve tous les fichiers
  • For u As Integer = 0 To (TblFiles.Length - 1)
  • Try
  • CurrentPath = TblFiles(u) 'On change de fichier courant
  • CurrentFile = New IO.FileStream(TblFiles(u), IO.FileMode.OpenOrCreate, IO.FileAccess.Read, IO.FileShare.Read, BytesStep) 'On change de fichier de lecture, on donne les acces et on met le buffer sur 16 octets
  • CurrentFileInfo = New IO.FileInfo(TblFiles(u)) 'Info sur le fichier en lecture courant
  • PathFile = Replace(TblFiles(u), Source, "") 'On ne garde que le chemin qui se trouve dans le répertoire soure
  • If Microsoft.VisualBasic.Left(PathFile, 1) = "\" Then PathFile = Mid(PathFile, 2) 'On enlève le "\" du début
  • DirOfPathFile = Replace(CurrentFileInfo.DirectoryName, Source, "") 'On ne garde que le chemin qui se trouve dans le répertoire soure
  • If Microsoft.VisualBasic.Left(DirOfPathFile, 1) = "\" Then DirOfPathFile = Mid(DirOfPathFile, 2) 'On enlève le "\" du début
  • DataFileXml &= "<Fichier>" & "<Chemin>" & PathFile & "</Chemin>" & "<Debut>" & CStr(FileCible.Position) & "</Debut>" & "<Taille>" & CStr(CurrentFile.Length) & "</Taille>" & "<DirPath>" & DirOfPathFile & "</DirPath>" & "</Fichier>" 'Eriture des infos du fichier nécéssaires au déchiffrage dans le fichier Xml
  • For i As Long = 1 To (CurrentFile.Length) Step BytesStep 'On lit BytesStep à la fois
  • BytesRead = CurrentFile.Read(Bytes, 0, (BytesStep - 1)) 'On lit n octets et on range tout ca dans Bytes
  • FileCible.Write(Bytes, 0, BytesRead) 'On les ecrit dans le fichier de destination si le tabelau d'octets est different
  • BytesWrite = FileCible.Position 'Bytes écrits
  • If (CurrentFile.Length - 1) > 0 Then PourCentInFile = CInt(Math.Round(i / (CurrentFile.Length - 1) * 100)) 'Progression de l'écriture
  • Next i
  • CurrentFile.Close() 'On ferme le fichier de lecture pour passer au suivant
  • CurrentFile = Nothing 'CurrentFile vaut plus rien
  • If (TblFiles.Length - 1) > 0 Then PourCent = CInt(Math.Round(u / (TblFiles.Length - 1) * 100)) 'Avancement par Fichier
  • Catch ex As Exception
  • MsgBox("Erreur : " & vbCrLf & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Erreur") 'Erreur!
  • End Try
  • Next u
  • 'On ferme le fichier cible
  • FileCible.Close()
  • FileCible = Nothing
  • DataFileXml &= "</Structure>" 'On termine le fichier Xml
  • 'On sauve les données Xml
  • Dim FileXml As New IO.StreamWriter(New IO.FileStream(Destination & "\" & Nom & "\" & Nom & ".xml", IO.FileMode.Create, IO.FileAccess.Write), System.Text.Encoding.UTF8)
  • FileXml.Write(DataFileXml)
  • 'On ferme le fichier Xml
  • FileXml.Close()
  • Catch ex As Exception
  • MsgBox("Erreur : " & vbCrLf & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Erreur")
  • End Try
  • End Sub
  • End Module
  • -------------------------------------------------------------------------------------------------------------------------------------
  • Option Strict On
  • Module ModRestore
  • Friend PourCent As Integer = 0 'Avancement total
  • Friend PourCentInFile As Integer = 0 'Avancement du fichier
  • Friend CurrentPath As String = "" 'Fichier courant en cours d'extraction
  • Friend NewThread As Threading.Thread 'Déclaration du thread
  • Friend BytesWrite As Long = 0 'Octets écrits
  • Friend Source As String 'Source (L'executable)
  • Friend PathCible As String 'Repertoire d'extraction
  • Friend Sub StartRestore()
  • 'Démarrage du Thread
  • NewThread = New Threading.Thread(AddressOf StartThread)
  • NewThread.Start()
  • End Sub
  • Private Sub StartThread()
  • 'Procédure du démarrage du Thread
  • Source = Application.ExecutablePath 'La source est evidemment l'Exe lui même d'où le terme "autoextractible"
  • RestoreDir()
  • End
  • End Sub
  • Private Sub RestoreDir()
  • Try
  • 'On definit les variables
  • Dim FilePath, DirPath As String 'Chemin du fichier de destination
  • Dim FileLenght, FilePosition As Long 'Position dans le fichier .dat et longueur
  • Dim CurrentFile As IO.FileStream 'Flux du fichier de sortie
  • Dim BytesStep As Integer = 1024 * 512 'Nombre d'octets à lire à la fois
  • Dim Bytes(BytesStep) As Byte 'Le tableau de bytes
  • Dim BytesRead As Integer 'Octets lus dans le flux
  • Dim MaxLenght As Integer 'Longueur maximum d'oectets à lire
  • 'On initie les valeurs
  • PourCent = 0
  • PourCentInFile = 0
  • If Microsoft.VisualBasic.Right(PathCible, 1) <> "\" Then PathCible &= "\" 'On rajoute "\" s'il n'existe pas
  • 'On definit le fichier de sauvegarde xml
  • Dim DataFilePath As String = Mid(Source, 1, Source.Length - 3) & "xml"
  • 'On ouvre le fichier xml qui contient les informations nécéssaires à la restauration
  • Dim XInfoFiles As New Xml.XmlDocument
  • XInfoFiles.Load(DataFilePath)
  • 'On ouvre le fichier data avec les acces et un buffer de 16
  • Dim DataFile As New IO.FileStream(Source, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read, BytesStep)
  • 'Parcours du fichier XMl et restauration des données
  • For u As Integer = 0 To (XInfoFiles.DocumentElement.ChildNodes.Count - 1)
  • Try
  • 'Lecture des infos
  • FilePath = PathCible & XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(0).ChildNodes(0).Value
  • FilePosition = CLng(XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(1).ChildNodes(0).Value)
  • FileLenght = CLng(XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(2).ChildNodes(0).Value)
  • If XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(3).ChildNodes.Count > 0 Then DirPath = PathCible & (XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(3).ChildNodes(0).Value) Else DirPath = PathCible
  • If IO.Directory.Exists(DirPath) = False Then IO.Directory.CreateDirectory(DirPath) 'Si le dossier existe pas, on le créé
  • CurrentPath = FilePath 'Mise dans la variable du fichier courant en cours d'extraction
  • CurrentFile = New IO.FileStream(FilePath, IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.Write, BytesStep) 'On ouvre le fichier où écrire les données avec les accès et toujours un buffer de 16 octets
  • DataFile.Position = FilePosition 'On va a la position du début du fichier
  • MaxLenght = BytesStep
  • For i As Long = 1 To (FileLenght) Step BytesStep 'n octet par n octet, on créé le fichier
  • If CurrentFile.Position + MaxLenght > FileLenght Then MaxLenght = CInt(FileLenght - CurrentFile.Position + 1)
  • BytesRead = DataFile.Read(Bytes, 0, (MaxLenght - 1)) 'On lit n octets dans le fichier autoextractible
  • CurrentFile.Write(Bytes, 0, BytesRead) 'Et on les écrits
  • BytesWrite = DataFile.Position 'Bytes écrits
  • If (FileLenght - 1) > 0 Then PourCentInFile = CInt(Math.Round(i / FileLenght * 100)) 'Progression de l'écriture
  • Next i
  • 'On ferme le fichier écrit pour passer au suivant
  • CurrentFile.Close()
  • CurrentFile = Nothing
  • If (XInfoFiles.DocumentElement.ChildNodes.Count - 1) > 0 Then PourCent = CInt(Math.Round(u / (XInfoFiles.DocumentElement.ChildNodes.Count - 1) * 100)) 'Avancement par Fichier
  • Catch ex As Exception
  • MsgBox("Erreur : " & vbCrLf & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Erreur") 'Erreur!
  • End Try
  • Next u
  • 'On ferme le fichier data
  • DataFile.Close()
  • DataFile = Nothing
  • Catch ex As Exception
  • MsgBox("Erreur : " & vbCrLf & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Erreur")
  • End Try
  • End Sub
  • End Module
Option Strict On
Module ModSave

    Friend PourCent As Integer = 0 'Avancement total
    Friend PourCentInFile As Integer = 0 'Avancement du fichier
    Friend CurrentPath As String = "" 'Fichier courant
    Friend NewThread As Threading.Thread 'Déclaration du Thread
    Friend BytesWrite As Long = 0 'Octets écrits

    Friend Source, Destination, Nom As String 'Source, Destination et Nom

    Friend Sub StartSave()
        'Démarrage du Thread
        NewThread = New Threading.Thread(AddressOf StartThread)
        NewThread.Start()
    End Sub

    Private Sub StartThread()
        'Procédure du démarrage du Thread
        SaveDir()
        End
    End Sub

    Public Sub SaveDir()

        Try

            'On initie les valeurs

            PourCent = 0
            PourCentInFile = 0

            Dim CurrentFile As IO.FileStream 'Fichier courant qui va être lu
            Dim CurrentFileInfo As IO.FileInfo 'Infos sur le fichier qui va être lu

            Dim BytesStep As Integer = 1024 * 512  'Nombre d'octets à lire à la fois
            Dim Bytes(BytesStep) As Byte 'Le tableau de bytes
            Dim BytesRead As Integer 'Octets lus dans le flux

            Dim PathFile As String = "" 'Chemin du fichier
            Dim DirOfPathFile As String = "" 'Chemin du répertoire du fichier

            'On créé une liste de tous les fichiers

            Dim TblFiles() As String

            TblFiles = IO.Directory.GetFiles(Source, "*.*", IO.SearchOption.AllDirectories)

            'On créé le répertoire de la sauvegarde s'il n'existe pas

            If IO.Directory.Exists(Destination & "\" & Nom) = False Then IO.Directory.CreateDirectory(Destination & "\" & Nom)

            'On copie le projet Exe de restauration si le fichier cible n'exite pas

            IO.File.Copy(Application.StartupPath & "\RestoreData.dat", Destination & "\" & Nom & "\" & Nom & ".exe", True)

            'On ouvre un nouveau flux dans le fichier cible après l'Exe servant au déchiffrage

            Dim FileCible As New IO.FileStream(Destination & "\" & Nom & "\" & Nom & ".exe", IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.ReadWrite, BytesStep)

            'On met la position du flux à la fin des données du programme de restauration du fichier cible

            Dim InfoFileRestore As New IO.FileInfo(Application.StartupPath & "\RestoreData.dat")

            'Creation du début des données du fichier Xml contenant toutes les données nécéssaires au déchiffrage

            Dim DataFileXml As String = ""

            DataFileXml = "<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "utf-8" & Chr(34) & "?>"
            DataFileXml &= "<Structure>"

            'On sauve tous les fichiers

            For u As Integer = 0 To (TblFiles.Length - 1)

                Try

                    CurrentPath = TblFiles(u) 'On change de fichier courant
                    CurrentFile = New IO.FileStream(TblFiles(u), IO.FileMode.OpenOrCreate, IO.FileAccess.Read, IO.FileShare.Read, BytesStep) 'On change de fichier de lecture, on donne les acces et on met le buffer sur 16 octets
                    CurrentFileInfo = New IO.FileInfo(TblFiles(u)) 'Info sur le fichier en lecture courant

                    PathFile = Replace(TblFiles(u), Source, "") 'On ne garde que le chemin qui se trouve dans le répertoire soure
                    If Microsoft.VisualBasic.Left(PathFile, 1) = "\" Then PathFile = Mid(PathFile, 2) 'On enlève le "\" du début
                    DirOfPathFile = Replace(CurrentFileInfo.DirectoryName, Source, "") 'On ne garde que le chemin qui se trouve dans le répertoire soure
                    If Microsoft.VisualBasic.Left(DirOfPathFile, 1) = "\" Then DirOfPathFile = Mid(DirOfPathFile, 2) 'On enlève le "\" du début

                    DataFileXml &= "<Fichier>" & "<Chemin>" & PathFile & "</Chemin>" & "<Debut>" & CStr(FileCible.Position) & "</Debut>" & "<Taille>" & CStr(CurrentFile.Length) & "</Taille>" & "<DirPath>" & DirOfPathFile & "</DirPath>" & "</Fichier>" 'Eriture des infos du fichier nécéssaires au déchiffrage dans le fichier Xml

                    For i As Long = 1 To (CurrentFile.Length) Step BytesStep 'On lit BytesStep à la fois
                        BytesRead = CurrentFile.Read(Bytes, 0, (BytesStep - 1)) 'On lit n octets et on range tout ca dans Bytes
                        FileCible.Write(Bytes, 0, BytesRead) 'On les ecrit dans le fichier de destination si le tabelau d'octets est different
                        BytesWrite = FileCible.Position 'Bytes écrits
                        If (CurrentFile.Length - 1) > 0 Then PourCentInFile = CInt(Math.Round(i / (CurrentFile.Length - 1) * 100)) 'Progression de l'écriture 
                    Next i

                    CurrentFile.Close() 'On ferme le fichier de lecture pour passer au suivant
                    CurrentFile = Nothing 'CurrentFile vaut plus rien

                    If (TblFiles.Length - 1) > 0 Then PourCent = CInt(Math.Round(u / (TblFiles.Length - 1) * 100)) 'Avancement par Fichier

                Catch ex As Exception
                    MsgBox("Erreur : " & vbCrLf & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Erreur") 'Erreur!
                End Try

            Next u

            'On ferme le fichier cible

            FileCible.Close()
            FileCible = Nothing

            DataFileXml &= "</Structure>" 'On termine le fichier Xml

            'On sauve les données Xml

            Dim FileXml As New IO.StreamWriter(New IO.FileStream(Destination & "\" & Nom & "\" & Nom & ".xml", IO.FileMode.Create, IO.FileAccess.Write), System.Text.Encoding.UTF8)

            FileXml.Write(DataFileXml)

            'On ferme le fichier Xml

            FileXml.Close()


        Catch ex As Exception
            MsgBox("Erreur : " & vbCrLf & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Erreur")
        End Try

    End Sub

End Module

-------------------------------------------------------------------------------------------------------------------------------------

Option Strict On
Module ModRestore
    Friend PourCent As Integer = 0 'Avancement total
    Friend PourCentInFile As Integer = 0 'Avancement du fichier
    Friend CurrentPath As String = "" 'Fichier courant en cours d'extraction
    Friend NewThread As Threading.Thread 'Déclaration du thread

    Friend BytesWrite As Long = 0 'Octets écrits

    Friend Source As String 'Source (L'executable)
    Friend PathCible As String 'Repertoire d'extraction

    Friend Sub StartRestore()
        'Démarrage du Thread
        NewThread = New Threading.Thread(AddressOf StartThread)
        NewThread.Start()
    End Sub

    Private Sub StartThread()
        'Procédure du démarrage du Thread
        Source = Application.ExecutablePath 'La source est evidemment l'Exe lui même d'où le terme "autoextractible"
        RestoreDir()
        End
    End Sub

    Private Sub RestoreDir()

        Try

            'On definit les variables

            Dim FilePath, DirPath As String 'Chemin du fichier de destination
            Dim FileLenght, FilePosition As Long 'Position dans le fichier .dat et longueur

            Dim CurrentFile As IO.FileStream 'Flux du fichier de sortie

            Dim BytesStep As Integer = 1024 * 512 'Nombre d'octets à lire à la fois
            Dim Bytes(BytesStep) As Byte 'Le tableau de bytes
            Dim BytesRead As Integer 'Octets lus dans le flux
            Dim MaxLenght As Integer 'Longueur maximum d'oectets à lire


            'On initie les valeurs

            PourCent = 0
            PourCentInFile = 0
            If Microsoft.VisualBasic.Right(PathCible, 1) <> "\" Then PathCible &= "\" 'On rajoute "\" s'il n'existe pas

            'On definit le fichier de sauvegarde xml

            Dim DataFilePath As String = Mid(Source, 1, Source.Length - 3) & "xml"

            'On ouvre le fichier xml qui contient les informations nécéssaires à la restauration

            Dim XInfoFiles As New Xml.XmlDocument
            XInfoFiles.Load(DataFilePath)

            'On ouvre le fichier data avec les acces et un buffer de 16

            Dim DataFile As New IO.FileStream(Source, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read, BytesStep)

            'Parcours du fichier XMl et restauration des données

            For u As Integer = 0 To (XInfoFiles.DocumentElement.ChildNodes.Count - 1)

                Try

                    'Lecture des infos

                    FilePath = PathCible & XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(0).ChildNodes(0).Value
                    FilePosition = CLng(XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(1).ChildNodes(0).Value)
                    FileLenght = CLng(XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(2).ChildNodes(0).Value)
                    If XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(3).ChildNodes.Count > 0 Then DirPath = PathCible & (XInfoFiles.DocumentElement.ChildNodes(u).ChildNodes(3).ChildNodes(0).Value) Else DirPath = PathCible

                    If IO.Directory.Exists(DirPath) = False Then IO.Directory.CreateDirectory(DirPath) 'Si le dossier existe pas, on le créé

                    CurrentPath = FilePath 'Mise dans la variable du fichier courant en cours d'extraction
                    CurrentFile = New IO.FileStream(FilePath, IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.Write, BytesStep) 'On ouvre le fichier où écrire les données avec les accès et toujours un buffer de 16 octets

                    DataFile.Position = FilePosition 'On va a la position du début du fichier

                    MaxLenght = BytesStep

                    For i As Long = 1 To (FileLenght) Step BytesStep 'n octet par n octet, on créé le fichier
                        If CurrentFile.Position + MaxLenght > FileLenght Then MaxLenght = CInt(FileLenght - CurrentFile.Position + 1)
                        BytesRead = DataFile.Read(Bytes, 0, (MaxLenght - 1)) 'On lit n octets dans le fichier autoextractible
                        CurrentFile.Write(Bytes, 0, BytesRead) 'Et on les écrits
                        BytesWrite = DataFile.Position 'Bytes écrits
                        If (FileLenght - 1) > 0 Then PourCentInFile = CInt(Math.Round(i / FileLenght * 100)) 'Progression de l'écriture
                    Next i

                    'On ferme le fichier écrit pour passer au suivant

                    CurrentFile.Close()
                    CurrentFile = Nothing

                    If (XInfoFiles.DocumentElement.ChildNodes.Count - 1) > 0 Then PourCent = CInt(Math.Round(u / (XInfoFiles.DocumentElement.ChildNodes.Count - 1) * 100)) 'Avancement par Fichier

                Catch ex As Exception
                    MsgBox("Erreur : " & vbCrLf & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Erreur") 'Erreur!
                End Try

            Next u

            'On ferme le fichier data

            DataFile.Close()
            DataFile = Nothing

        Catch ex As Exception
            MsgBox("Erreur : " & vbCrLf & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Erreur")
        End Try

    End Sub

End Module

Conclusion

Cette source peut être largement améliorée :
Quelques idées :
1 - Algorithme de codage de HuffMan, utile pour réduire la taille du fichier
2 - Cryptage des données
3 - Mise à jour sans réécrire tout le fichier

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

29 octobre 2006 18:03:30 :
Petite erreur qui n'empêchait pas le fonctionnement du script.
30 octobre 2006 08:52:15 :
Au lieu de lire 16 octets à la fois, on en lit un.
04 novembre 2006 16:08:58 :
Vitesse d'écriture, Choix du répertoire d'extraction, Vitesse passe de 10Ko/sec à 30Mo/Sec (chez moi..), Fichiers intacts à l'extraction

Commentaires et avis

signaler à un administrateur
Commentaire de Charles Racaud le 29/10/2006 21:35:38

Merci de supprimer les dossiers "bin" et "obj" qui prenne de la place et qui nous sont inutiles.

Sinon, bah, je n’ai pas trop regardé le code.
Y'a de l'idée, mais pourquoi ne pas pouvoir choisir le dossier d'extraction ? Ca évitera de se trainer un xml non ?

Sinon, plus grave.
C'a marche pas tout à fait très bien. Ca modifie la fin des fichiers à l'extraction
Exemple, j'ai pris un fichier "toto.txt" ou j'ai écris "abcdef"
Après empaquetage et réextraction, j'ouvre mon fichier "toto.txt" et je trouve dedans "abcdef4, 654, C". Donc ce n’est pas au point tout ca.
A corriger.

Bonne prog
__________
Kenji

signaler à un administrateur
Commentaire de yvesyves le 29/10/2006 23:04:19

Ah bon, je n'ai pas ce genre d'erreurs et heuresement sinon les fichiers executables extraits ne pourraient pas s'ouvrir or ce n'est pas le cas...
Le code est ok la dessus d'ailleurs.

signaler à un administrateur
Commentaire de yvesyves le 29/10/2006 23:06:14

Je viens de tester un fichier Txt et je le retrouve comme avant, je me demande comment tu en es arrivé là?

signaler à un administrateur
Commentaire de Charles Racaud le 29/10/2006 23:23:34

Si je confirme.
Avec qu'un fichier txt dans l'archive, j'ai au début "abcdef" et à la fin "abcdef          ".
Un fichier de 6 octets fini en fichier de 16 octets bizzard non ?
Bon j'ai regardé un peu le code et en effet, tu fait une lecture de 16 octets par 16 octets.
Donc si la taille du fichier n'est pas un multiple de 16. Ca rajoute des octets.
Pourquoi faire le transfert par paquets de 16 octets ?
__________
Kenji

signaler à un administrateur
Commentaire de yvesyves le 30/10/2006 08:26:04

Je vais corriger ca.

signaler à un administrateur
Commentaire de yvesyves le 30/10/2006 08:52:44

C'est corrigé

signaler à un administrateur
Commentaire de eldim le 31/10/2006 12:12:12

Bonjour,

Le principe à l'air bien mais qu'est-ce que c'est lent... et ça bouffe énormément de processeur... (avec les timers...)

Bref bien mais à optimiser sérieusement...

signaler à un administrateur
Commentaire de yvesyves le 31/10/2006 16:24:59

Ceci est un exemple pour montrer comment créer un fichier autoextractible, je ne cherche pas à faire une application performante mais à montrer un principe. Je n'optimiserai pas ce code pour l'instant.

signaler à un administrateur
Commentaire de yvesyves le 04/11/2006 16:10:08

Bon finalement j'ai optimisé le code car c'est vrai que la vitesse était vraiment longue..
Voici les améliorations :
Vitesse d'écriture, Choix du répertoire d'extraction, Vitesse passe de 10Ko/sec à 30Mo/Sec (chez moi..), Fichiers intacts à l'extraction

signaler à un administrateur
Commentaire de yvesyves le 04/11/2006 16:13:25

J'ajoute par la même occasion que l'utilisation du processeur tourne autour de 10% contre 100 avant ;)

signaler à un administrateur
Commentaire de NHenry le 06/11/2006 12:59:03

Bonjour,

C'est toi qui t'occupe de la (dé)compression (algo perso)?
Si c'est le cas, pourquoi ne pas utiliser 7Zip ?

signaler à un administrateur
Commentaire de yvesyves le 06/11/2006 17:16:27

Désolé je montre juste comment faire un autoextractible, autoextractible ca ne veut pas dire forcement fichier compréssé...

signaler à un administrateur
Commentaire de eldim le 07/11/2006 16:23:17

c'est mieux en ce qui concerne la vitesse.

question : dans le cas où un fichier est utilisé et qu'on essai de le sauvegarder... il se passe koi ? il est ignoré sans log ?

signaler à un administrateur
Commentaire de eldim le 07/11/2006 16:32:25

je viens de tester plus sérieusement, bon l'erreur est signalée par boite de dialogue... mais bon ok.
ce qui manque surtout à ce source c'est une bonne compression...
mais bon l'idée est très bien !

signaler à un administrateur
Commentaire de ricco le 07/09/2007 16:44:57

Bonjour
Ta démarche m'intéresse et je voudrais savoir comment tu as crée le fichier Exe qui te sert d modèle. Par avance je te remercie de ta réponse
Claude

signaler à un administrateur
Commentaire de yvesyves le 07/09/2007 21:10:25

Bonjour,
Ca fait longtemps que j'ai fais cette source. Je me rends compte qu'un fichier Xml de dépendance n'est pas terrible mais je ne reprendrais pas cette source même si elle mérite que je la recode sans fichier Xml.
En gros j'ai créé deux projets. Le premier pour la restauration et le second pour la sauvegarde. Le premier à l'éxcution examine le fichier Xml (créé par le second projet). Celui ci contient les offsets des fichiers enregistrés. Il se place en position dans son propore fichier pour extraire les données. Le second projet enregistre le premier projet compiler de .dat (je l'ai renommé comme ca mais c'est un executable) en .exe  et écris à la suite les fichiers voulus. Evidemment la premier offset est connus puisqu'il sagit de la longeur du fichier projet de restauration. J'éspère avoir été clair sinon j'essairai de détailler.

signaler à un administrateur
Commentaire de ricco le 15/12/2007 17:39:20 10/10

Parfait ta démarche m'a permis d'avancer sur mon programme de découpe de gros fichiers. Merci pour ton aide
Claude

signaler à un administrateur
Commentaire de yvesyves le 17/12/2007 18:03:03

De rien

signaler à un administrateur
Commentaire de BIGDAMSBIG le 13/01/2008 04:10:52 10/10


bonjour 2YVES

un peu prise de tete car je suis débutant et je ne serais dire que ce n'est autre que de la precision de
haute voltige commencant a peine a comprendre ton programme au bout de 2 semaines vus à mes instants perdus.

au moins toutes mes questions obcsures sur ton programmes
m'auront apportées une parcelle de connaissance à mon ignorance.

les commentaires sur ton code sont d'ailleurs
trés enrichissants.

je devrais me taire car je suis un non initié
mais je tiens a dire que ton code  reste captivant.

car qui ne voudrait rendre auto extracible
plusieur fichiers avec le plaisir de ne pas passer
par un compresseur tout fait.le zip fait mieux certes
mais cela n'est pas non plus ton objectif majeur.

c'est du bon. pour la compression ya mieux
mais la trame est la.

-je sais maintenant plus que rien.

-de rien

merci tout de meme...



signaler à un administrateur
Commentaire de yvesyves le 13/01/2008 18:58:27

Merci et content que ce code t'es apporté un plus. Petite précision : il n'y a aucune compression mais si tu veux utlise Bzip qui est inclus dans le framework donc tout pret à l'emploi!

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Copier un dossier et ses sous-dossiers et fichier en même temps... [ par Haaltruf ] Question déja posée par Nexus mais comment faire pour déplacer ou copier tout un dossier et ce qu'il contient ?Merci d'avance,Haaltruf Comment copier un fichier et le coller dans un dossier ? [ par Chricl ] Voila, je dispose d'un fichier Qui à pour nom xxx.cnt dans un certain dossier, et je dispose du même fichier dans un autre dossier.Le premier fichier *** COPIER UN FICHIER DANS 1 DOSSIER *** [ par Heny ] Salut a tous'****Enregistrement d'un fichier de sauvgarde****'Créer la dossierSet fs = CreateObject("Scripting.FileSystemObject")If fs.FolderExists("C Copier fichier temporaire [ par croftman ] Bonjour,Voila, j'aimerais copier des fichiers situer dans le dossier "temporary internet files"(sous xp) dans un autre dossier, mais quand j'essaie av Récupérer un fichier dans un dossier par defaut et le copier dans un autre dossier par defaut [ par anton8338 ] Bonjour à tous,Que je vous explique je cherche à savoir comment je pourrais faire pour qu'en cliquant sur un bouton cela m'ouvre le dossier (pour récu Action lors d'un dépot de fichier dans un dossier [ par gruzlor ] Salut,Je travaille dans une société qui stocke moults fichiers sur serveurs. Mon problème est que les fichiers sont toujours mal classés et que leurs Copier le contenu d'un dossier automatiquement dans des clés usb [ par Allan67 ] Bonjour, Je suis complètement débutant dans le codage et je voudrai créer un logiciel permettant, lorsqu'il est ouvert (bien sur) de copier le contenu Supprimer un octet d'un fichier binaire [ par jnbrunet ] Salut,J'aimerais savoir si, en utilisant IO, il est possible de supprimer complètement un octet d'un fichier. Je peux toujours déplacer tous les octet Ecrire dans un fichier texte existant quand mon programme ce lance [ par Triboutmatthieu ] Bonjour, j'ai crée un programme et ce programme se lance dés que Windows s'ouvre.Je voudrais savoir si mon programme pourrait introduire dans un fichi question [ par axllxa ] Pour le


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


HTC Magic

Entre 429€ et 429€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.