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

Dotnet Discussion :

Copy & Delete error: using by another process


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2009
    Messages
    245
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 245
    Par défaut Copy & Delete error: using by another process
    Bonjour,

    J'ai un traitement dans ma page web qui doit renommer un fichier et un autre traitement similaire qui doit déplacer le fichier.

    Pour des questions de pertes de données possible, je ne fais pas de "Move" mais j'utilise "Copy" puis "Delete"

    Le problème est que lors que je copy le fichier ciblé et que je le delete, lors du delete, une exception remonte comme quoi mon fichier est utilisé par un autre processus (la copy).

    J'aimerais savoir si vous avez des solutions pour effectuer ces 2 manipulations successivement sans lever cette exception.

    j'ai trouvé une méthode qui permet de régler ce problème mais rien n'y fait, 1 fois 2, ça plante..



    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
                            {
     
                                System.IO.File.Copy(fileori,filedest)
                                if (WaitForFile(fileori))
                                    System.IO.File.Delete(filePathSrc + fileName);
     
                            }
                            catch (Exception)
                            {
                                  //exception
                            }

    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
     
     
    bool WaitForFile(string fullPath)
        {
            int numTries = 0;
            while (true)
            {
                ++numTries;
                try
                {
                    // Attempt to open the file exclusively.
                    using (FileStream fs = new FileStream(fullPath,
                        FileMode.Open, FileAccess.ReadWrite,
                        FileShare.None, 100))
                    {
                        fs.ReadByte();
     
                        // If we got this far the file is ready
                        break;
                    }
                }
                catch (Exception ex)
                {
                    if (numTries > 20)
                    {
                        // trace
                        return false;
                    }
     
                    // Wait for the lock to be released
                    System.Threading.Thread.Sleep(700);
                }
            }
     
            //trace
            return true;
        }
    Merci.

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Dans WaitForFile(), le FileStream fs n'est pas fermé.

  3. #3
    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
    WaitForFile ne sert à rien : File.Copy est synchrone, donc la copie est déjà terminée quand l'appel se termine.

    A priori ton fichier source doit déjà être ouvert à un autre endroit...

    Citation Envoyé par Graffito Voir le message
    Dans WaitForFile(), le FileStream fs n'est pas fermé.
    Si, il est fermé à la fin du bloc using... c'est d'ailleurs la raison d'être de using.

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Février 2013
    Messages : 51
    Par défaut
    Bonjour,

    Parfois un fichier peut être utilisé par un processus du type Anti-Virus ou même l'explorateur de fichiers (c'est souvent le cas pour des images ou des vidéos pour générer les miniatures).

    Il y a un outil, ProcessExplorer, qui permet de savoir qui utilise un fichier ouvert.
    (http://technet.microsoft.com/en-us/s.../bb896653.aspx)

    A votre disposition pour en parler.

    Bonne journée,
    Pascal

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2009
    Messages
    245
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 245
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    Un peu plus de détails, mon fichier est un pdf qui peux éventuellement être visualiser par quelqu'un de la même session ou sur une session différente avant ce traitement.
    Néanmoins, des fois la copie/ suppression du fichier se fait plusieurs minutes voir plusieurs heures après !

    Du coup, je ne peux interdire cette visualisation, Il n'existe aucun moyen de supprimer quand même le fichier, ou alors fermer l'utilisation en cours ? à la fin de l'aperçu peu être..

    Merci.

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Février 2013
    Messages : 51
    Par défaut
    Et bien, je pense que la solution la plus simple est de mettre en place un répertoire "temporaire" pour placer les fichiers à visualiser.

    Et ensuite de lancer un batch régulièrement (tous les jours) qui supprime les anciens fichiers (par exemple de plus de 48h).

    Qu'en penses-tu ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/03/2014, 13h09
  2. Réponses: 5
    Dernier message: 23/04/2013, 01h41
  3. Error using ==> |
    Par yasminsila dans le forum Images
    Réponses: 3
    Dernier message: 30/05/2008, 08h39
  4. Error using ''fft'' (out of memory ?)
    Par salimilas dans le forum MATLAB
    Réponses: 1
    Dernier message: 21/05/2007, 15h35
  5. error : connection is in use by another statement
    Par dd_garion dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/08/2006, 14h52

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