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

ASP.NET Discussion :

Droits de suppression, Dispose() et petit suicide.


Sujet :

ASP.NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Par défaut Accès fichier refusé, Dispose() et petit suicide.
    Bonjour à tous !
    J'écris ici pour vous faire part d'un double questionnement :
    • premièrement, un problème d'accès fichier pour suppression
    • deuxièmement, des précisions sur la méthode Dispose() du framework

    Voila, je développe un outil d'administration pour une entreprise. Sur cet outil, je donne la possibilité à l'utilisateur de créer des objets (au sens POO) contenant sémantiquement des objets Image (Bitmap plus précisément), et par conséquent, le mec peut uploader un fichier image correspondant (typiquement jpg ou gif).

    Je rencontre un probleme en environnement de prod (mais pas sur ma machine de développement), à savoir:
    un objet Bitmap enregistré avec la méthode Save comme ceci (code allégé, j'ai retiré tous les try catch):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tmpInFile = imageFileUpload.PostedFile;
    Bitmap imgCreated = new Bitmap(tmpInFile.InputStream);
    imgCreated.Save(strFileNameOnServer);
    Cette image créée à l'adresse strFileNameOnServer ne peut pas être supprimée immédiatement par le même utilisateur. Le serveur renvoit l'exception suivante:
    System.IO.IOException: Le processus ne peut pas accéder au fichier 'C:\salut_les_muscles.jpg', car il est en cours d'utilisation par un autre processus.

    Par contre, l'image s'affiche correctement, et tout se passe bien mis à part quand on veut la supprimer.
    Aléatoirement (cela peut varier de 2 min à 15 min plus tard), la suppression redevient possible.
    Après plusieurs tests, j'ai noté les points suivants:
    • Un autre utilisateur ne peut pas toujours supprimer le fichier que vient de créer un premier utilisateur, mais parfois un peu quand même...
    • Fermer la session de l'utilisateur et revenir pour supprimer l'image fonctionne parfois.
    • L'attribut windows du fichier image récemment créé sur le serveur est un petit 'a' (grand 'A' habituellement pour les fichiers windows).


    Et mon deuxième questionnement concerne la méthode Dispose(), que je n'ai pas utilisée après le Save de mon objet Bitmap.
    Que fait-elle réellement? Peut-elle résoudre mon problème?
    (Je précise que pour tester cette méthode, je dois déranger le monsieur qui gère le serveur de préprod, actuellement en réunion sinon je l'aurais deja essayée).

    Désolé pour le manque de précisions concernant ce probleme qui je le répète, n'arrive qu'en prod. Je n'ai pas accès directement aux configurations IIS là-bas (le serveur n'est même pas dans mon bâtiment...).

    Je vous remercie de m'avoir lu, et le cas échéant d'avoir tenté d'essayer de subvenir à mon appel à l'aide.

    Bye !

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Par défaut
    ton imgCreated il faut le fermer après avoir sauvegardé ton fichier. sinon personne ne peut avoir accès à ce fameux fichier. je pense que c'est la raison pour laquelle ton fichier est supprimé aléatoirement. le garbage collector supprime la ressource quand elle n'est plus utilisée et quand il peut.

    En fait c'est un problème l'accès concurrent au fichier sur les applications web voir windows. Mate sur le net si par hasard il n'y aurait pas une solution pour gérer ce cas.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Par défaut
    Merci pour ta réponse rattlehead.
    Je dois carrément faire un imgCreated.Close()?
    .net ne gère pas ça tout seul?

    J'ai déjà pas mal cherché sur le net, mais comme je ne connais pas vraiment la nature du problème, c'est pas évident...
    Je vais quand même refaire un tour.

    En tout cas merci

    ++

  4. #4
    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 : 43
    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
    Je ne pense pas que ce soit ça le problème... la méthode Bitmap.Save ferme le fichier quand elle a fini il me semble.

  5. #5
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Je pense que c'est aspnet_wp qui lock le fichier

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Par défaut
    Je n'ai pas encore complètement résolu le problème, mais je crois que je suis sur la bonne piste.

    Je ne l'avais pas précisé dans le sujet, car cela aurait compliqué sa compréhension:
    en fait, après confirmation de l'utilisateur et sauvegarde de mon fichier image, je redirige vers la page d'affichage de toutes les images liées "sémantiquement".
    Or ces images sont des miniatures des originales, que je crée brutalement au premier affichage si elles n'existent pas. Et c'est dans cette même page que je peux les selectionner et les supprimer, alors que les thumbnails sont affichés.

    Ce qui correspond, si je viens de créer le thumbnail, à faire ces opérations à la suite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Bitmap imgGet = new Bitmap("C:/Images/Le_miel_et_les_abeilles.jpg");
    Bitmap imgReduced = new Bitmap(imgGet, new Size(Convert.ToInt32(Math.Floor(imgGet.Size.Width * .5)), Convert.ToInt32(Math.Floor(imgGet.Size.Height * .5))));
    imgReduced.Save("C:/Images/Le_miel_et_les_PETITES_abeilles.jpg");
    [...]
    File.Delete("C:/Images/Le_miel_et_les_PETITES_abeilles.jpg");
    J'imagine que le handler sur le fichier original n'est pas bien fermé, alors qu'entre temps je redirige comme un goret sur la même page pour forcer le PostBack...
    J'ai rajouté des "Dispose()" sur les objets Bitmap à la fin de cette méthode de création des thumbnails, je pense que c'est la clef.

    J'attends que le monsieur qui gère les serveurs me remplace les deux pauvres dll et je vous tiens au courant .

    ++

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Par défaut
    Confirmé, ça fonctionne (réponse précédente).

    Morale de l'histoire: quand on fait des copies d'images Bitmap (ou similaire) sur le serveur, et qu'on fait des Redirect, il faut avoir pris bien soin de libérer les ressources des objets servant à la copie.
    Vivent les bisounours.

    Note: une solution de porc temporaire fonctionne également quand un fichier est locké comme ceci: éxécuter un batch directement depuis le C# si le Delete ordinaire ne fonctionne pas.
    le fichier .bat serait celui-ci:
    @echo Off
    del %1

    et l'appel:
    System.Diagnostics.Process.Start(@"C:\del_file.bat", fileName);
    Mais c'est très crade.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/06/2008, 18h07
  2. Droit de suppression de fichier
    Par legentil dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 29/05/2008, 17h10
  3. [Administration] Limiter le Droit de suppression d'un fichier.
    Par babo dans le forum Subversion
    Réponses: 4
    Dernier message: 11/07/2007, 09h57
  4. Nouveaux : droit de suppression de vos messages
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 8
    Dernier message: 25/04/2006, 17h10

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