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

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut 'Le processus ne peut pas accéder au fichier 'x.png', car il est en cours d'utilisation par un autre processus
    Bonjour,

    J´ai un bouton delete pour effacer aussi bien dans ma database comme le fichier dans le disque dur.
    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
    private void DeleteButton_Click(object sender, EventArgs e)
            {
     
                Cursor.Current = Cursors.WaitCursor;
                /////
     
                /////
                string location = Directory.GetCurrentDirectory() + @"\Saints\" + CategoriaCaballerosComboBox.Text + @"\" + NombreCaballerosTextBox.Text;
                if (Directory.Exists(Directory.GetCurrentDirectory() + @"\Saints\" + CategoriaCaballerosComboBox.Text + @"\" + NombreCaballerosTextBox.Text))
                {
                    //using (var image = Image.FromFile(location))
                    //{
                    //    CaballeroPictureBox.Image = (Image)image.Clone();
                    //}
     
                    CaballeroPictureBox.Dispose();
     
                    Directory.Delete(location, true);
                }
     
                SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True");
                con.Open();
                if (CaballerosDataGridView.SelectedRows.Count > 0)
                {
                    int selectedIndex = CaballerosDataGridView.SelectedRows[0].Index;
                    int rowID = int.Parse(CaballerosDataGridView[0, selectedIndex].Value.ToString());
                    SqlCommand cmd = new SqlCommand("DELETE FROM Caballeros where Id=@id;", con);
                    cmd.Parameters.AddWithValue("@id", rowID);
                    cmd.ExecuteNonQuery();
                    con.Close();
                    MessageBox.Show("deleted");
                    RefreshDataGrid();
                    Cursor.Current = Cursors.Default;
                }
            }
    Mais en cliquant dessus j´ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.IO.IOException*: 'Le processus ne peut pas accéder au fichier 'x.png', car il est en cours d'utilisation par un autre processus.'
    Donc comment contourner ce probleme ?
    Merci

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    A partir du moment où ton programme va lire une image, elle sera utilisée.
    Pour supprimer cette image, faut libérer la ressource qui l'utilise.
    Si par exemple, tu charges une image dans un picture box, ce picture doit être libéré car il utilise l'image.
    Sauf que le Dispose ne suffit, puisque ton picture box est utilisé par la fiche auquel il est attaché et le GC ne la libérera pas tant que cette fenêtre existera.

    Si ce n'est pas ton programme qui l'utilise tu peux utiliser des outils comme Process Explorer (procexp.exe, fourni avec WIndows).

    Autre point qui n'a rien à voir.
    Utilise Path.Combine au lieu de concaténer les chemin à la main.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String location = Path.Combine(Directory.GetCurrentDirectory(), "Saints", CategoriaCaballerosComboBox. Text,NombreCaballerosTextBox.Text);
    C'est plus simple et tu n'a pas besoin de te demander quel est le séparateur de répertoire.
    Edit :
    Si tu as beaucoup de segments tu peux passer par une collection de chaîne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String location = Path.Combine(new String[] { Directory.GetCurrentDirectory(), "Saints", CategoriaCaballerosComboBox.Text, NombreCaballerosTextBox.Text });

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par popo Voir le message
    A partir du moment où ton programme va lire une image, elle sera utilisée.
    Sauf que le Dispose ne suffit, puisque ton picture box est utilisé par la fiche auquel il est attaché et le GC ne la libérera pas tant que cette fenêtre existera.
    Merci d´avoir repondu.
    Entre temps j´ai trouver une autre solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CaballeroPictureBox.Image.Dispose();
    CaballeroPictureBox.Image = null;
    CaballeroPictureBox.ImageLocation = null;
    Vous me direz si cela est correct mais cela marche pour moi.

    Un commentaire sur cela ?

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Disons que forcer la propriété Image à null est une manière bien brutal de permettre
    au GC de libérer la ressource. En effet, le contrôle n'a plus du tout de lien avec l'image dans ce cas là.
    Mais je ne suis pas certain que cela fonctionne tout le temps. Mais je ne suis pas un spécialiste du GC alors je laisserai d'autres personnes répondre à cette question

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 121
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 121
    Points : 1 628
    Points
    1 628
    Par défaut
    une façon plus propre peut-être est de passer true à image.Dispose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CaballeroPictureBox.Image.Dispose(true);
    https://learn.microsoft.com/fr-fr/do...owsdesktop-6.0

Discussions similaires

  1. Réponses: 18
    Dernier message: 28/10/2009, 23h17
  2. Réponses: 22
    Dernier message: 02/10/2009, 10h31
  3. Réponses: 7
    Dernier message: 22/08/2008, 16h20
  4. Réponses: 5
    Dernier message: 26/06/2008, 12h28
  5. Erreur : Le processus ne peut pas accéder au fichier
    Par victor72 dans le forum Dev-C++
    Réponses: 1
    Dernier message: 16/03/2007, 14h50

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