2017-04-04 95 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