IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Probleme avec les fichiers


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Probleme avec les fichiers
    Bonjour,

    Je réalise en vb.net un programme qui transfert des fichiers sur un FTP, tous les fichiers d'un répertoire donné.

    D'abord une connexion à une base de données MySQL se fait pour récupérer les infos FTP.

    La connexion FTP se fait
    Le fichier est crypté en utilisant CryptoStream (une copie est créée meme nom avec .crypt à la fin)
    La version cryptée est transférée sur le FTP
    La version cryptée est supprimée
    Le fichier local est déplacé dans un autre dossier qui rassemble les fichiers transférés
    On passe au fichier suivant

    Tout se passe bien lorsque je teste le programme en debug
    L'install est créée se déroule bien

    Le programme tourne bien sur un poste "lent", seulement sur d'autres, une fois la copie cryptée créée portant le nom suivi de .crypt, le transfert FTP ne peut se faire car "le fichier est utilisé par un autre process".

    Comment forcer ma fonction Crypt() à "lacher" le fichier qu'elle a créé et le rendre accessible pour la suite du programme...?

  2. #2
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    Tu as dû oublier les dipose sur les stream, ni utilisé de using.

    Exemple de la MSDN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    Imports System
    Imports System.IO
    Imports System.Security.Cryptography
    
    
    
    Class RijndaelExample
    
        Public Shared Sub Main()
            Try
    
                Dim original As String = "Here is some data to encrypt!"
    
                ' Create a new instance of the Rijndael
                ' class.  This generates a new key and initialization 
                ' vector (IV).
                Using myRijndael = Rijndael.Create()
    
                    ' Encrypt the string to an array of bytes.
                    Dim encrypted As Byte() = EncryptStringToBytes(original, myRijndael.Key, myRijndael.IV)
    
                    ' Decrypt the bytes to a string.
                    Dim roundtrip As String = DecryptStringFromBytes(encrypted, myRijndael.Key, myRijndael.IV)
    
                    'Display the original data and the decrypted data.
                    Console.WriteLine("Original:   {0}", original)
                    Console.WriteLine("Round Trip: {0}", roundtrip)
                End Using
            Catch e As Exception
                Console.WriteLine("Error: {0}", e.Message)
            End Try
    
        End Sub 'Main
    
        Shared Function EncryptStringToBytes(ByVal plainText As String, ByVal Key() As Byte, ByVal IV() As Byte) As Byte()
            ' Check arguments.
            If plainText Is Nothing OrElse plainText.Length <= 0 Then
                Throw New ArgumentNullException("plainText")
            End If
            If Key Is Nothing OrElse Key.Length <= 0 Then
                Throw New ArgumentNullException("Key")
            End If
            If IV Is Nothing OrElse IV.Length <= 0 Then
                Throw New ArgumentNullException("Key")
            End If
            Dim encrypted() As Byte
            ' Create an Rijndael object
            ' with the specified key and IV.
            Using rijAlg = Rijndael.Create()
    
                rijAlg.Key = Key
                rijAlg.IV = IV
    
                ' Create a decrytor to perform the stream transform.
                Dim encryptor As ICryptoTransform = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV)
                ' Create the streams used for encryption.
                Using msEncrypt As New MemoryStream()
                    Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
                        Using swEncrypt As New StreamWriter(csEncrypt)
    
                            'Write all data to the stream.
                            swEncrypt.Write(plainText)
                        End Using
                        encrypted = msEncrypt.ToArray()
                    End Using
                End Using
            End Using
    
            ' Return the encrypted bytes from the memory stream.
            Return encrypted
    
        End Function 'EncryptStringToBytes
    
        Shared Function DecryptStringFromBytes(ByVal cipherText() As Byte, ByVal Key() As Byte, ByVal IV() As Byte) As String
            ' Check arguments.
            If cipherText Is Nothing OrElse cipherText.Length <= 0 Then
                Throw New ArgumentNullException("cipherText")
            End If
            If Key Is Nothing OrElse Key.Length <= 0 Then
                Throw New ArgumentNullException("Key")
            End If
            If IV Is Nothing OrElse IV.Length <= 0 Then
                Throw New ArgumentNullException("Key")
            End If
            ' Declare the string used to hold
            ' the decrypted text.
            Dim plaintext As String = Nothing
    
            ' Create an Rijndael object
            ' with the specified key and IV.
            Using rijAlg = Rijndael.Create()
                rijAlg.Key = Key
                rijAlg.IV = IV
    
                ' Create a decrytor to perform the stream transform.
                Dim decryptor As ICryptoTransform = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV)
    
                ' Create the streams used for decryption.
                Using msDecrypt As New MemoryStream(cipherText)
    
                    Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
    
                        Using srDecrypt As New StreamReader(csDecrypt)
    
    
                            ' Read the decrypted bytes from the decrypting stream
                            ' and place them in a string.
                            plaintext = srDecrypt.ReadToEnd()
                        End Using
                    End Using
                End Using
            End Using
    
            Return plaintext
    
        End Function 'DecryptStringFromBytes 
    End Class
    
    Bon dév.
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    En fait, Je n'ouvre pas vraiment le fichier en flux, j'en ouvre un autre dont je crypte le contenu, et je copy ce contenu dans un nouveau fichier avec FileSystem.CopyFile.

    Ensuite, ma fonction FTP est censée envoyer ce fichier, mais sur certains postes, le message d'erreur apparait disant que le fichier est en cours d'utilisation par un autre processus et donc echec.

    Voici la fonction qui crypte et créée un nouveau fichier (largement inspirée d'aides trouver sur internet) :

    Sub CrypterFichier(ByVal fichierSource As String)

    Dim monfichier As String = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\fichiertemporaire.tmp"

    Dim clef As New DESCryptoServiceProvider
    clef.Key() = Encoding.UTF8.GetBytes("motpasse")
    clef.IV() = Encoding.UTF8.GetBytes("motpasse")

    Dim sr As StreamReader = New StreamReader(fichierSource, FileShare.ReadWrite)

    Dim ligne As String
    ligne = sr.ReadToEnd.TrimEnd()
    sr.Close()
    sr.Dispose()


    EncryptTextemonfichier(ligne, monfichier, clef.Key, clef.IV)
    My.Computer.FileSystem.CopyFile(monfichier, fichierSource & ".crypt", True)
    My.Computer.FileSystem.DeleteFile(monfichier)
    FileSystem.FileClose()

    End Sub

    Le fichier portant l'extension .crypt est bien créé mais plus utilisable ensuite pour être transféré...

  4. #4
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Utilises les balises code, ce sera plus simple pour lire...

    Le code de la fonction EncryptTextemonfichier???
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Oui pardon. Faut mettre la balise code donc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        Function EncryptTextemonfichier(ByVal data As String, ByVal monfichier As String, ByVal Key() As Byte, ByVal IV() As Byte) As Byte
            Dim fStream As FileStream = File.Open(monfichier, FileMode.OpenOrCreate, FileShare.ReadWrite)
            Dim cStream As New CryptoStream(fStream, New DESCryptoServiceProvider().CreateEncryptor(Key, IV), CryptoStreamMode.Write)
            Dim ecrire As New StreamWriter(cStream)
            ecrire.WriteLine(data)
            ecrire.Close()
            cStream.Close()
            fStream.Close()
            fStream.Dispose()
            ecrire.Dispose()
            cStream.Dispose()
     
        End Function

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Pas d'idée pour que le fichier soit libérer et donc exploitable ensuite?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Fichier indisponible
    J'ai fait quelques changements sur le programme histoire de voir si cela règlerai le problème :

    Je ne crypte plus les fichiers pour les envoyer.
    Je créé un fichier Zip en utilisant Ionic Zip, avec encryption
    Je mets dans ce zip tous les fichiers à transférer

    Je déplace l'ensemble des fichiers mis dans le zip vers un autre dossier (deja_envoyes).

    Jusqu'ici, tout va bien. Le fichier Zip est bien créé, les fichiers ensuite bien déplacés.

    Le problème intervient ensuite, et sur tous les autres postes mis à part celui que j'utilise pour le développement.

    Le fichier Zip ne peut ni être transféré via FTP, ni déplacer à son tour vers le dossier "deja_envoyés". Le message d'erreur est que le programme ne peut pas accéder au fichier car deja utilisé par un autre process....

    Des idées, i need some help....

Discussions similaires

  1. probleme avec les fichier jar
    Par maind5or dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 14/05/2007, 14h50
  2. Probleme avec les fichiers XML
    Par fle7a dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 17/07/2006, 10h32
  3. Probleme avec les fichier openGL32.dll et glu32.dll
    Par gazzall17 dans le forum OpenGL
    Réponses: 4
    Dernier message: 16/03/2006, 12h10
  4. Probleme avec les fichier faire un copier coller
    Par mcdonald dans le forum Général Python
    Réponses: 4
    Dernier message: 29/01/2006, 13h38
  5. [VB.NET] Probleme avec les fichiers!!
    Par ludovic85 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/01/2005, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo