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

VB.NET Discussion :

Supprimer un fichier en WPF


Sujet :

VB.NET

  1. #1
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut Supprimer un fichier en WPF
    Salut,

    J'affiche une image dans le composant Image comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim newImage As New BitmapImage
    newImage.BeginInit()
    newImage.UriSource = New Uri(CheminDel'Image)
    newImage.EndInit()
    imgModifCouv.Source = newImage
    Maintenant, si je supprime l'image:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    My.Computer.FileSystem.DeleteFile(CheminDel'Image)
    J'ai l'erreur suivante:
    Le processus ne peut pas accéder au fichier 'CheminDel'Image', car il est en cours d'utilisation par un autre processus.
    J'ai pu identifier ce qui posé problème. L'image est utilisée par "newImage" lorsque je veux supprimer l'image du ddr.
    Je ne sais pas comment faire pour que l'image ne soit plus utilisé par "newImage".

    Je précise que je travaille en WPF.

    Merci

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Il doit y'avoir Close() ou Dispose() sur newImage

  3. #3
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    J'ai déjà essayé, ces méthodes ne sont pas disponibles dans le type BitmapImage.

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Et en mettant newImage à null juste avant?

  5. #5
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    newImage.UriSource=Nothing
    imgModifCouv.Source=Nothing
    Mais sans succès

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    et carrement newImage= Nothing ?

  7. #7
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Non plus, je me demande si ça vient de newImage...

  8. #8
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Par défaut, BitmapImage ouvre une image avec l'option BitmapCacheOptions.OnDemand. Cela évite de décoder toute l'image d'un coup. Par conséquent, cela conserve un verrou sur le fichier. une solution est de définir le BitmapCacheOption à OnLoad.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bi.BeginInit();
    bi.CacheOption = BitmapCacheOption.OnLoad;
    bi.UriSource = ...;
    bi.EndInit();
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  9. #9
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Bon, le code que tu m'as donné n'a pas résolu mon souci.

    L'affiche de l'image se fait au chargement d'une fenêtre modale.
    Ensuite à la fermeture de celle-ci je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    My.Computer.Network.DownloadFile(listeAjout(3), My.Settings.Lien & listeAjout(2))
    .Item("CheminG") = listeAjout(2)
     
    If System.IO.File.Exists(Chemin) = True Then
    My.Computer.FileSystem.DeleteFile(Chemin)
    End If
    J'ai supprimé le code qui permet de mettre l'image dans Image et malgré ça j'ai toujours le message d'erreur alors qu'il n'y a pas d'image dans Image!

    Est-il possible que l'erreur vienne de DownloadFile?
    Car le nom de l'image que je supprime est identique à celui téléchargé (en faite je fais une mise à jour de la même image)

    Je précise qu'en winforms, je n'ai jamais eu ce problème (le code de cette partie est identique en WPF)

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par yonpo Voir le message
    Je précise qu'en winforms, je n'ai jamais eu ce problème (le code de cette partie est identique en WPF)
    Ah bon ? Pourtant le même problème se pose d'habitude avec Image.FromFile... sauf qu'en WinForms tu peux faire un Dispose de l'image.

    J'aurais cru que le BitmapCacheOption.OnLoad règlerait le problème, mais apparemment ce n'est pas le cas... sinon il y a une méthode plus radicale : gérer toi même le flux du fichier image, de façon à ce que le BitmapImage n'ai même pas connaissance du fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim newImage As New BitmapImage
    Using fs As Stream = File.OpenRead(CheminDeLImage)
        newImage.BeginInit()
        newImage.StreamSource = fs
        newImage.EndInit()
    End Using
    imgModifCouv.Source = newImage
    Là au moins tu es sûr que le flux du fichier est bien fermé...

  11. #11
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Je réagie par rapport à mon poste précédent.
    J'ai supprimé le code suivant à l'ouverture de la fenêtre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim newImage As New BitmapImage
    newImage.BeginInit()
    newImage.UriSource = New Uri(CheminDeLImage)
    newImage.EndInit()
    imgModifCouv.Source = newImage
    Donc normalement, si l'image n'était pas affiché, je ne devais pas avoir d'erreur. Bah non! Toujours l'erreur...
    Et là tilt!! La même image est ouverte de la même façon dans la fenêtre principale!!
    C'était normal que je ne pouvais pas la supprimer puisqu'elle était utilisé ailleurs.
    Donc désormais, j'affiche les l'images issues du disque dur avec BitmapCacheOption.OnLoad. Et ça fonctionne parfaitement.

    tomlev, je garde ta proposition, j'en aurait surement besoin un jour.

    Merci à tous!

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par yonpo Voir le message
    tomlev, je garde ta proposition, j'en aurait surement besoin un jour.
    Bah en WPF je pense qu'il vaut mieux utiliser BitmapCacheOption.OnLoad de toutes façons. Par contre, cette technique est utile en WinForms, avec Image.FromStream en remplacement de Image.FromFile.

  13. #13
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bah en WPF je pense qu'il vaut mieux utiliser BitmapCacheOption.OnLoad de toutes façons. Par contre, cette technique est utile en WinForms, avec Image.FromStream en remplacement de Image.FromFile.
    OK merci pour les précisions apportées

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

Discussions similaires

  1. [VB.NET] Comment supprimer un fichier qui est utilisé ?
    Par Toon94 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/06/2010, 12h59
  2. [cvs] supprimer un fichier
    Par ed_hunter dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 27/03/2007, 18h17
  3. Supprimer plusieurs fichiers...
    Par Thierry8 dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2005, 11h43
  4. Comment supprimer des fichiers en nombre ?
    Par Didier L dans le forum API, COM et SDKs
    Réponses: 13
    Dernier message: 25/01/2005, 16h01
  5. Supprimer un fichier par rapport a une date
    Par NewB dans le forum Linux
    Réponses: 2
    Dernier message: 25/06/2003, 13h44

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