2017-04-04 1 views
0

J'ai quelques problèmes avec cette erreur dans Visual Studio:Erreur: « Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus » dans Visual Studio C#

An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll

Additional information: The process cannot access the file 'C:\Users\aheij\Desktop\KinectOutput\swipe.txt' because it is being used by another process.

Ce que j'ai essayé: J'ai essayé d'utiliser ces codes obtenus à partir d'autres questions StackOverflow résolues similaires à la mienne pour essayer de résoudre le problème - mais même cela ne semblait pas fonctionner? J'ai essayé checking if the file is in use, mais sans succès. Je exécute également Visual Studio en tant qu'administrateur.

Le fichier n'est pas en lecture seule.

Le dossier n'est pas ouvert, et le fichier n'est utilisé dans aucun autre programme lors de l'exécution du code - du moins pas que je puisse voir/connaître.

Le code: Donc, pour ajouter un contexte à mon code: Je suis en train d'écrire un code de détection de geste rapide au code SDK Kinect C# v2 de BodyBasics disponible gratuitement. C'est une méthode d'aide que j'ai ajoutée, qui est appelée quand une personne est en vue. Si cette personne exécute le geste, la méthode écrit l'heure et le nom du geste dans un fichier texte.

La moitié du temps, lorsque le code fonctionne, la reconnaissance gestuelle fonctionne bien. Cependant, l'autre moitié du temps, le code se casse/s'arrête parce que l'écriture dans le bit de fichier provoque l'erreur.

Ci-dessous est mon code pour voir si la personne est debout dans la position neutre - c'est un peu désagréable, donc excuses à ce sujet. Je l'ai commenté « erreur » où l'erreur est (sans surprise):

private void Neutral_stance(VisualStyleElement.Tab.Body body, IReadOnlyDictionary<JointType, Joint> joints, IDictionary<JointType, Point> jointPoints, BodyFrame bf) 
{ 
    CameraSpacePoint left_hand = joints[JointType.HandLeft].Position; 
    CameraSpacePoint left_elbow = joints[JointType.ElbowLeft].Position; 
    CameraSpacePoint left_shoulder = joints[JointType.ShoulderLeft].Position; 
    CameraSpacePoint left_hip = joints[JointType.HipLeft].Position; 
    CameraSpacePoint right_hand = joints[JointType.HandRight].Position; 
    CameraSpacePoint right_elbow = joints[JointType.ElbowRight].Position; 
    CameraSpacePoint right_shoulder = joints[JointType.ShoulderRight].Position; 
    CameraSpacePoint right_hip = joints[JointType.HipRight].Position; 

    double vertical_error = 0.15; 
    double shoulderhand_xrange_l = Math.Abs(left_hand.X - left_shoulder.X); 
    double shoulderhand_xrange_r = Math.Abs(right_hand.X - right_shoulder.X); 

    if (bf != null) 
    { 
     TimeSpan frametime = bf.RelativeTime; 
     string path_p = @"C:\Users\aheij\Desktop\KinectOutput\Punch.txt"; //write to punch file 
     string path_s = @"C:\Users\aheij\Desktop\KinectOutput\swipe.txt"; //write to swipe file 
     if (left_hand.Y < left_elbow.Y) 
     { 
      if (right_hand.Y < right_elbow.Y) 
      { 
       if (shoulderhand_xrange_l < vertical_error) 
       { 
        if (shoulderhand_xrange_r < vertical_error) 
        { 
         Gesture_being_done.Text = " Neutral"; 
         File.AppendAllText(path_p, frametime.ToString() + " Neutral" + Environment.NewLine); //ERROR 
         File.AppendAllText(path_s, frametime.ToString() + " Neutral" + Environment.NewLine); //ERROR 
        } 
       } 
      } 
     } 
     else 
     { 
      Gesture_being_done.Text = " Unknown"; 
      File.AppendAllText(path_p, frametime.ToString() + " Unknown" + Environment.NewLine); //ERROR 
      File.AppendAllText(path_s, frametime.ToString() + " Unknown" + Environment.NewLine); //ERROR 
     } 
    } 

} 

Toutes les solutions/idées/suggestions pour me diriger sur la bonne voie serait apprécié. Je pense qu'il serait bon d'utiliser la méthode 'using streamwriter' par opposition à la méthode que j'utilise ici - mais je ne sais pas comment? Toute aide serait appréciée.

Additionnel Info: Utilisation de Visual Studio 2015; Utilisation de Windows 10.

Sidenote: J'ai lu quelque part que l'outil Windows Search dans Windows 10 peut interférer et causer des problèmes comme celui-ci, donc je dois le désactiver?

+0

Avez-vous essayé d'ouvrir le fichier en tant que 'FileStream' comme décrit [ici] (https://msdn.microsoft.com/fr-fr/library/5h0z48dh (v = vs.110) .aspx), puis ajoutez le texte? – Harry

+0

Ces problèmes sont presque toujours causés par l'ouverture du fichier dans votre propre programme et ne jamais le fermer. Recherchez partout où le fichier 'swipe.txt' est utilisé dans votre programme et assurez-vous qu'il est ouvert, modifié, puis fermé bientôt. –

+0

L'exécution de ce code sur un thread de travail est une autre explication simple. Si cela fonctionne plus d'une fois, vous aurez ce problème. Utilisez Debug> Windows> Threads lorsque vous obtenez l'exception, faites-le thread-safe avec l'instruction 'lock'. –

Répondre

0

Comme me l'a suggéré j'ai utilisé la méthode Filestream & assuré que le fichier a été fermé après utilisation. Mais, même cela a toujours causé la même erreur.

Ainsi, je me suis également débarrassé d'avoir deux actions d'écriture de fichier en succession rapide les uns des autres. Je ne sais pas si cela est techniquement correct ou même vrai, mais basé sur ce post ici: link, mon erreur pourrait venir parce que j'essaie d'exécuter la deuxième ligne 'écrire au fichier texte' tandis que la précédente 'écrire au texte file 'ligne est toujours en cours d'exécution/écriture dans ce même dossier & emplacement - d'où le choc? S'il vous plaît quelqu'un, corrigez-moi si je me trompe.

De toute façon, cela semble avoir fonctionné. Voir ci-dessous pour mon édition/méthode corrigée:

 private void Neutral_stance(Body body, IReadOnlyDictionary<JointType, Joint> joints, IDictionary<JointType, Point> jointPoints, BodyFrame bf) 
    { 
     //cameraspace point joint stuff here again (see original post for this bit leading up to the if statements.) 

     if (bf != null) 
     { 
      TimeSpan frametime = bf.RelativeTime; 
      string path_s = @"C:\Users\aheij\Desktop\KinectOutput\swipe.txt"; 

      if (left_hand.Y < left_elbow.Y) 
      { 
       if (right_hand.Y < right_elbow.Y) 
       { 
        if (shoulderhand_xrange_l < vertical_error) 
        { 
         if (shoulderhand_xrange_r < vertical_error) 
         { 
          Gesture_being_done.Text = " Neutral"; 

          FileStream fs_s = new FileStream(path_s, FileMode.Append); //swipe 
          byte[] bdatas = Encoding.Default.GetBytes(frametime.ToString() + " Neutral" + Environment.NewLine); 
          fs_s.Write(bdatas, 0, bdatas.Length); 
          fs_s.Close(); 
         } 
        } 
       } 
      } 
      else 
      { 
       Gesture_being_done.Text = " Unknown"; 
       FileStream fs_s = new FileStream(path_s, FileMode.Append); 
       byte[] bdatas = Encoding.Default.GetBytes(frametime.ToString() + " Unknown" + Environment.NewLine); 
       fs_s.Write(bdatas, 0, bdatas.Length); 
       fs_s.Close(); 
       } 
     } 

    } 

Do me faire savoir s'il y a quelque façon que je peux le rendre plus élégant ou tout ce que je devrais être au courant de w.r.t cette réponse. Le code est basé sur le code trouvé ici: FileStream Tutorial website