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

C# Discussion :

File.Delete impossible, utilisation par process [Débutant]


Sujet :

C#

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut File.Delete impossible, utilisation par process
    Bonjour,
    J'ai un problème pour supprimer mon fichier.

    Je m'explique.
    J'ai deux services qui discutent ensemble un service web et un service Windows.

    le service Windows appelle une méthode du service web.
    Cette méthode a pour retour une classe contenant un stream.

    Mon problème est donc que je ne peux pas faire un FileStream.close avant mon retour car sinon le flux étant fermé je ne peux pas faire le retour.
    Et malheureusement, une fois le return fait, je ne reviens pas vers le service web.

    Donc lors de ma deuxième exécution, quand je veux supprimer le fichier. Je ne peux pas car il est utilisé par un procesuss. Le service web je suppose.

    Dans la méthode appelé par le service Windows.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    ...
    fs = new FileStream(MonFichier, FileMode.Open, FileAccess.Read);//, FileShare.Delete);
    MyReturnRequest.Data = fs;
    MyReturnRequest.MyClassSynchro = MyClassSynchro;
    MyReturnRequest.MyClassSynchro.LastDateSynchro = DateTime.Now;
    //Si ici je fais fs.Close(); mon return lèvera une exception
    return MyReturnRequest; //Le return renvoie vers mon service windows.

    Dans une autre méthode plus tôt je fais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    If (File.Exist(MonFichier) == true)
    {
        File.Delete(MonFichier); //Ici j'aurais un problème indiquant qu'un processus utilise ce fichier.
    }
    J'espère avoir été clair.
    Merci

  2. #2
    Membre confirmé
    Femme Profil pro
    Développeur .NET
    Inscrit en
    avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : avril 2009
    Messages : 339
    Points : 577
    Points
    577
    Par défaut
    Et si tu fais un :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    try {
      ...
      ...
      fs = new FileStream(MonFichier, FileMode.Open, FileAccess.Read);//, FileShare.Delete);
      MyReturnRequest.Data = fs;
      MyReturnRequest.MyClassSynchro = MyClassSynchro;
      MyReturnRequest.MyClassSynchro.LastDateSynchro = DateTime.Now;
      //Si ici je fais fs.Close(); mon return lèvera une exception
      return MyReturnRequest; //Le return renvoie vers mon service windows.
    }
    finally {
      fs.Close();
    }

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,
    Merci de répondre.

    Non, malheureusement, cela fait partie des nombreux test que j'ai effectué avant de poster.

    J'ai l'impression qu'il met en mémoire MyReturnRequest, va faire le finally et revient faire le return.

    L'erreur est celle qui me dit que mon flux est fermé.
    J'ai même poussé le vice en lui mettant un sleep avant le fs.Close(); dans le finally. Résultat il a attendu 30 sec avant de planter ^^.

  4. #4
    Membre éclairé Avatar de PatteDePoule
    Homme Profil pro
    Développeur .NET
    Inscrit en
    août 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : août 2008
    Messages : 380
    Points : 763
    Points
    763
    Par défaut
    Est-ce que tu pourrais contourner le problème en envoyant simplement un byte[] (qui est le contenu du fichier) au lieu du Stream?
    Les fautes d'orthographes sus-citées sont déposées auprès de leurs propriétaires respectifs. Aucune responsabilité n'est engagée sur la lisibilité du message ou les éventuels dommages qu'il peut engendrer.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,
    Merci de votre réponse.
    Non l'envoie par stream est une condition imposé de mon projet.
    Et je pense que cela est plus performant étant donnée la masse d'information envoyé.

    Je ne vois pas d'autre solution que d'ouvrir une nouvelle connexion pour nettoyer l'ensemble de mes fichiers obsolète après transfert, mais cela ne me satisfait pas beaucoup..

    Je laisse le post ouvert, si quelque pense à quelque chose d'autre.

    Merci.

  6. #6
    Membre confirmé
    Femme Profil pro
    Développeur .NET
    Inscrit en
    avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : avril 2009
    Messages : 339
    Points : 577
    Points
    577
    Par défaut
    Et pourquoi ne pas mettre en place un retour du service web qui confirme que le flux a bien été reçu, et qui permet à ton service windows de déclencher le nettoyage ensuite ?

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,

    Le service Windows n'a pas de visibilité sur les dossiers que l'on veut supprimer. Ils sont sur deux machines distantes.

    L'ouverture de la connexion se fait depuis le service Windows et se ferme après réception des documents.

  8. #8
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Hello, je ne comprends pas comment se fait l'appel du service web par le service Windows. Pourrais-tu envoyer le code ?
    Personnellement j'ai du mal à comprendre la logique d'un renvoi de flux "brut".
    "C'est tellement merdique que toute modification est une amélioration !"

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,
    Pour commencer bonne fête à vous.

    J'aurais peut être du préciser que mon service Windows intégrais WCF.

    J'ai donc :

    ServiceWindows (WCF) <---> Service Web

    Le SWindows appel une méthode référencée dans l'interface de mon service Web avec en paramètre une class contenant un stream et une class d'info.
    Le retour de cette méthode est la même chose. Un stream et une class d'info.

    Dans la valeur de retour, j'ai donc mes datas (stream) que je ne peux fermer si je veux que l'envoie se passe bien.
    Le problème étant qu'une fois la valeur de retour bien arrivé sur le SWindows, je coupe la communication entre mes deux services.

    La communication étant coupée, je ne vois pas comment fermer mon stream du coté WEB et mon accès fichier est donc toujours ouvert. Conséquence, impossible de supprimer ce fichier car considéré comme "utilisé par un processus"..

    L'idée de les faire communiquer de nouveau juste pour nettoyer les fichiers ne me plait pas beaucoup..

    Merci à vous.

  10. #10
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Question : fais-tu tes tests sur 2 machines ou sur une seule ?
    "C'est tellement merdique que toute modification est une amélioration !"

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Sur une seule.
    Tout est en local, mise a part une bdd.

  12. #12
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Ok, c'est ce que je pensais.
    Sur quelle "plateforme" tourne ton service web : IIS ou l'outil de debuggage Visual Studio ?
    "C'est tellement merdique que toute modification est une amélioration !"

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Il est dans VS mais à l'avenir il devrait être monté sur IIS.

  14. #14
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Tout d'abord petit conseil : monte ton site web, ça t'évitera des déconvenues plus tard...

    Avec une référence dans le deuxième post à ceci :
    http://msdn.microsoft.com/en-us/library/ms731913.aspx

    J'ai pas testé mais ça semble intéressant pour transférer toutes les données avant de supprimer le fichier.
    Tiens-moi au courant
    "C'est tellement merdique que toute modification est une amélioration !"

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    On m'a soufflé une solution que voila.

    Déclaré un Event que l'on ajoute à OperationContext.Current.OperationCompleted
    Ceci se déclenche quand la connexion est complètement fermé. Il permet donc de finir le travail.

    En voulant me renseigner sur le OperationContext je suis tombé sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     EventHandler CloseAndDeleteFile = new EventHandler((object sender, EventArgs e) => { fs.Close(); File.Delete(MonFichier); });
                OperationContext.Current.OperationCompleted += CloseAndDeleteFile;
                return MyReturnRequest;
    Merci beaucoup à ceux qui sont venu me répondre et ont pris du temps pour les recherches.
    une bonne fin d'année à vous.

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

Discussions similaires

  1. Obtenir l'utilisation de la bande passante par process
    Par OjBarbare dans le forum Réseau
    Réponses: 0
    Dernier message: 06/05/2015, 11h09
  2. Mémoire ram utilisée par un process
    Par Empty_body dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/12/2008, 12h46
  3. Utilisation de file.delete()
    Par kqman dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 05/06/2008, 17h25
  4. GetProcessTimes pour % CPU d'utilisation par process
    Par sgrangier dans le forum Langage
    Réponses: 1
    Dernier message: 27/09/2005, 15h03
  5. Comment lire un fichier DB en cours d'utilisation par 1 autr
    Par jbat dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/03/2004, 11h06

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