2017-04-04 126 views
0

我有一些麻煩,這個錯誤在Visual Studio「因爲它正在使用由另一個進程的進程無法訪問該文件」:錯誤:在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.

我曾嘗試: 我試過使用這些代碼從其他解決StackOverflow問題獲得類似於我的嘗試解決問題 - 但即使這似乎並沒有工作? 我試過checking if the file is in use,但沒有成功。

我也以管理員身份運行Visual Studio。

該文件不是隻讀的。

該文件夾未打開,並且該文件在執行代碼時未在其他任何程序中使用 - 至少不是我可以看到/知道的。

代碼: 所以,在一定範圍內添加到我的代碼:我寫一些簡單的手勢檢測代碼到Kinect的C#BodyBasics SDK V2代碼免費提供。這是我添加的一個輔助方法,當人們看到時會被調用。如果該人正在執行手勢,則該方法將幀時間和手勢名稱寫入文本文件。

有一半的時間,當代碼工作時,手勢識別效果很好。然而,另一半時間,代碼打破/停止,因爲寫入文件位會導致錯誤。

下面是我的代碼,看看這個人是否站在中立位置 - 它有點waffly,所以很抱歉。我有評論「錯誤」,其中錯誤的是(意料之中):

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

} 

任何解決方案/意見/建議點我在正確的軌道上,將不勝感激。我認爲使用'使用streamwriter'方法而不是我在這裏使用的方法會很好 - 但我不知道如何?任何幫助,將不勝感激。

Additonal Info:使用Visual Studio 2015;使用Windows 10.

旁註:我讀過的地方,Windows 10中的Windows搜索工具可能會干擾並導致這樣的問題,所以我需要禁用它?

+0

您是否試圖按照[此處]所述的'FileStream'打開文件(https://msdn.microsoft.com/zh-cn/library/5h0z48dh (v = vs.110).aspx),然後附加文字? – Harry

+0

這些問題幾乎總是由您在自己的程序中打開文件造成的,並且永遠不會關閉它。在你的程序中搜索'swipe.txt'文件並確保它被打開,修改,然後很快關閉。 –

+0

讓這段代碼在工作線程上運行是另一種簡單的解釋。如果它運行不止一次,那麼你會遇到這個問題。當遇到異常時,使用Debug> Windows> Threads,使用'lock'語句使其成爲線程安全的。 –

回答

0

正如我建議我使用Filestream方法&確保文件在使用後關閉。但是,即使這樣也會導致同樣的錯誤。

因此,我也擺脫了彼此快速連續的兩個文件寫入動作。我不知道這在技術上是對的,甚至是真的,但基於這篇文章:link,我的錯誤可能會出現,因爲我試圖執行第二個'寫入文本文件'行,而以前的'寫入文本文件'行仍在執行/寫入同一文件夾&位置 - 因此衝突?請有人,糾正我,如果我錯了。

無論哪種方式,這似乎工作。 我的編輯/糾正方法參見下文:

 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(); 
       } 
     } 

    } 

不要讓我知道如果有什麼辦法可以讓這個更優雅或其他任何東西我應該知道w.r.t這個答案。 該代碼基於在此處找到的代碼:FileStream Tutorial website