2017-04-04 19 views
0
in Visual Studio C#

ich mit diesem Fehler in Visual Studio einige Probleme habe:Fehler: ‚Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird‘

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.

Was ich versucht habe: Ich habe versucht, diese Codes zu verwenden, die von anderen gelösten StackOverflow-Fragen erhalten wurden, ähnlich wie bei mir, um das Problem zu lösen - aber selbst das schien nicht zu funktionieren? Ive versuchte checking if the file is in use, aber ohne Erfolg.

Ich auch Visual Studio als Administrator ausführen.

Die Datei ist nicht schreibgeschützt.

Der Ordner ist nicht geöffnet, und die Datei wird in keinem anderen Programm verwendet, wenn ich den Code ausführe - zumindest nicht, was ich sehen/wissen kann.

Der Code: Also, einige Kontext zu meinem Code hinzufügen: Ich bin ein paar schnelle Geste Erkennungscode an die Kinect C# BodyBasics SDK v2 Code frei verfügbar zu schreiben. Dies ist eine Hilfsmethode, die ich hinzugefügt habe und die aufgerufen wird, wenn eine Person in Sicht ist. Wenn diese Person die Geste ausführt, schreibt die Methode die Bildzeit und den Gestennamen in eine Textdatei.

Die Hälfte der Zeit, wenn der Code funktioniert, funktioniert die Gestenerkennung gut. In der anderen Hälfte der Zeit bricht der Code jedoch ab, weil das Schreiben in das Dateibit den Fehler verursacht.

Unten ist mein Code, um zu sehen, ob die Person in der neutralen Position steht - es ist ein bisschen waffel, also Entschuldigung dafür. Ich habe ‚ERROR‘ kommentiert, wo der Fehler ist (wenig überraschend):

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 
     } 
    } 

} 

Alle Lösungen/Ideen/Anregungen mich auf dem richtigen Weg zeigen würde geschätzt. Ich denke, es wäre gut, die 'using streamwriter'-Methode zu verwenden, im Gegensatz zu der Methode, die ich hier verwende - aber ich bin mir nicht sicher, wie? Jede Hilfe wäre willkommen.

Weitere Informationen: Verwenden von Visual Studio 2015; Verwenden von Windows 10.

Seitennotiz: Ich habe irgendwo gelesen, dass das Windows-Suchwerkzeug in Windows 10 stören kann und solche Probleme verursachen, also muss ich es deaktivieren?

+0

Haben Sie versucht, die Datei als 'FileStream' zu öffnen, wie beschrieben [hier] (https://msdn.microsoft.com/en-us/library/5h0z48dh (v = vs.110) .aspx), und fügen Sie dann den Text an? – Harry

+0

Diese Probleme werden fast immer dadurch verursacht, dass Sie die Datei in Ihrem eigenen Programm öffnen und niemals schließen. Suchen Sie überall dort, wo die Datei 'swipe.txt' in Ihrem Programm verwendet wird und stellen Sie sicher, dass sie geöffnet, geändert und bald geschlossen wird. –

+0

Die Ausführung dieses Codes in einem Arbeitsthread ist eine weitere einfache Erklärung. Wenn es mehr als einmal ausgeführt wird, haben Sie dieses Problem. Verwenden Sie Debug> Windows> Threads, wenn Sie die Ausnahme erhalten, machen Sie sie threadsicher mit der Anweisung 'lock'. –

Antwort

0

Als Vorschlag für mich verwendete ich die Filestream-Methode & sichergestellt, dass die Datei nach dem Gebrauch geschlossen wurde. Aber selbst das verursachte immer noch den gleichen Fehler.

So habe ich auch zwei Aktenschreiben Aktionen in schneller Abfolge voneinander loswerden. Ich weiß nicht, ob das technisch richtig oder sogar richtig ist, aber basierend auf diesem Post hier: link, mein Fehler könnte kommen, weil ich versuche, die zweite 'schreibe in Textdatei' Zeile auszuführen, während die vorherige 'in Text schreiben Datei 'Linie wird immer noch ausgeführt/Schreiben in den gleichen Ordner & Ort - daher der Konflikt? Bitte jemanden, korrigiere mich, wenn ich falsch liege.

In jedem Fall scheint dies zu funktionieren. unten für meine bearbeitet/korrigiert Methode Siehe:

 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 lassen Sie mich wissen, ob es einen Weg gibt, kann ich das elegantere oder alles, was ich von w.r.t diese Antwort bewusst sein, machen sollte. Der Code basiert auf dem hier gefundenen Code: FileStream Tutorial website

Verwandte Themen