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 :

System.IO.IOException -- Je sèche


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut System.IO.IOException -- Je sèche
    Bonjour,

    Je n'arrive pas à régler cette exception.

    J'essaie de fournir à l'utilisateur un moyen de mettre son propre logo dans mon appli.
    J'ouvre un openfiledialog pour choisir l'image à afficher dans une pictureBox.
    Je copie l'image choisie dans le appdata de l'appli et j'écris le chemin dans le fichier de config.

    Le fichier copié dans Appdata doit être à chaque fois écrasé par la nouvelle image choisie.

    Ça marche une seul fois. Dès la deuxième fois le fichier copié dans appdata n'est plus accessible et provoque l'exception :

    System.IO.IOException : 'Le processus ne peut pas accéder au fichier 'C:\Users\...\1.1.0.0\fichiers\image_logo.png', car il est en cours d'utilisation par un autre processus.'
    C'est ma propre appli qui utilise le fichier car si je n'affecte pas l'image au pictureBox là ça marche.

    J'ai essayé plusieurs façon de copier le fichier (toutes avec Filestream), elle fonctionnent toutes mais le fichier n'est toujours plus accessible la seconde fois qu'on veut modifier l'image.

    Je ne comprends pas.
    C'est le fait de charger la pictureBox avec l'image qui m'empêche ensuite d'accéder au fichier.
    Comment libérer la ressource ?
    J'ai tenté de décharger l'image du pictureBox avant d'appeler la méthode mais rien n'y fait.
    Ma pictureBox peut n'avoir plus aucune image (null), le fichier dans Appdata n'est toujours pas accessible.

    Je comprends que dalle.

    Merci !


    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
     
            private void LogoImg_Click(object sender, EventArgs e)
            {
                openFileDialog2.Filter = "Fichier image (*.png)|*.png|Fichier image (*.jpg)|*.jpg|All files (*.*)|*.*";
     
                openFileDialog2.FileName = "";
                DialogResult result = openFileDialog2.ShowDialog();
     
     
                this.LogoImg.Image = null;
                this.LogoImg.Refresh();
     
     
                if (result == DialogResult.OK)
                {
     
                    Console.WriteLine(openFileDialog2.FileName.Substring(openFileDialog2.FileName.LastIndexOf("\\") + 1));
                    string file = openFileDialog2.FileName.Substring(openFileDialog2.FileName.LastIndexOf("\\") + 1);
                    int first = openFileDialog2.FileName.IndexOf(file);
                    string rep = openFileDialog2.FileName.Substring(0, first);
     
                    string TargetRep = Application.LocalUserAppDataPath + "\\fichiers";
     
                        string sourceFile = rep + "\\" + file;
                        string destFile = TargetRep + "\\" + "image_logo.png";
     
                        CopyBinaryFile(sourceFile, destFile);
     
                        using (FileStream FSnewlogo = new FileStream(destFile,FileMode.Open, FileAccess.Read))
                        {
                                Image NewLogo = Image.FromFile(FSnewlogo.Name);
                                LogoImg.Image = NewLogo;
                                Ecrit_Config("ImgLogo", destFile);
     
                                FSnewlogo.Close();
                                FSnewlogo.Dispose();
                        }
     
                }
     
            }
     
                static bool CopyBinaryFile(string srcfilename, string destfilename)
     
                {
                    if (System.IO.File.Exists(srcfilename) == false)
                    {
                        Console.WriteLine("Could not find the Source file");
                        return false;
                    }
     
                    System.IO.Stream s1 = System.IO.File.Open(srcfilename, System.IO.FileMode.Open);
                    System.IO.Stream s2 = System.IO.File.Open(destfilename, System.IO.FileMode.Create);
     
                    System.IO.BinaryReader f1 = new System.IO.BinaryReader(s1);
                    System.IO.BinaryWriter f2 = new System.IO.BinaryWriter(s2);
     
                    while (true)
     
                    {
     
                        byte[] buf = new byte[10240];
     
                        int sz = f1.Read(buf, 0, 10240);
     
                        if (sz <= 0)
     
                            break;
     
                        f2.Write(buf, 0, sz);
     
                        if (sz < 10240)
     
                            break; // eof reached
     
                    }
     
                f1.Close();
                f1.Dispose();
                f2.Close();
                f2.Dispose();
     
                s1.Close();
                s1.Dispose();
                s2.Close();
                s2.Dispose();
     
     
                return true;
                }
     
            private bool Ecrit_Config(string elementkey, string elementvalue)
            {
                try
                {
                    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                    config.GetSection("appSettings");
                    config.AppSettings.Settings.Remove(elementkey);
                    config.AppSettings.Settings.Add(elementkey, elementvalue);
                    config.Save(ConfigurationSaveMode.Modified);
                    ConfigurationManager.RefreshSection("appSettings");
                }
                catch (Exception)
                {
                    return false;
     
                }
                    return true;
     
     
            }

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ce n'est pas de ta faute, c'est un bug connu
    image.Fromfile ne libère pas le fichier
    il y a plusieurs contournements, de mémoire image.Fromstream() et un new memorystream(io.file.Readallbytes(path).toarray())
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour
    Si tu est sur que c'est du au picturebox ,image.clone() est ton ami ,car il permet de surmonter le handicap car cette version de chargement d'image verrouille la ressource Image qui ne peut lu être modifie(en fait le fichier conteneur est verrouille):

    code .cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Image NewLogo = Image.FromFile("").Clone() as Image ;
                                LogoImg.Image = NewLogo;
                                Ecrit_Config("ImgLogo", destFile);
    bon code...

  4. #4
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut
    Merci pour vos réponses.
    C'est en effet que le FromFile ne libère pas la ressource.
    Il faut le lui dire en clair par un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                        if (LogoImg.Image != null)
                        {
                            LogoImg.Image.Dispose();
                        }
    avant de tenter un changement d'image.
    Le genre de truc qui te bloque bien comme il faut pendant des heures...
    C'est résolu, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Creation d'un zip : System.IO.IOException
    Par kiuraaaa dans le forum VB.NET
    Réponses: 0
    Dernier message: 16/06/2017, 19h52
  2. [VB6] [Système] Récupérer le contenu d'une fenêtre DOS
    Par Nounours666 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 18/11/2004, 16h38
  3. [VB6] [Système] Barre des taches
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2002, 15h16
  4. [VB6] [Système] Icones du systray qui veulent pas partir
    Par Ctof dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/10/2002, 09h41
  5. [TP7]systeme d'exploitation
    Par numeror dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 15/08/2002, 08h47

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