繁体   English   中英

错误:Visual Studio c# 中的“进程无法访问该文件,因为它正被另一个进程使用”

[英]Error: 'The process cannot access the file because it is being used by another process' in Visual Studio c#

我在 Visual Studio 中遇到了这个错误:

mscorlib.dll 中发生类型为“System.IO.IOException”的未处理异常

附加信息:该进程无法访问文件“C:\\Users\\aheij\\Desktop\\KinectOutput\\swipe.txt”,因为它正被另一个进程使用。

我尝试过的:我尝试使用从与我的类似的其他已解决的 StackOverflow 问题中获得的这些代码来尝试解决问题 - 但即使这样似乎也不起作用? 我试过检查文件是否正在使用,但没有成功。

我也以管理员身份运行 Visual Studio。

该文件不是只读的。

该文件夹未打开,并且该文件在执行代码时未在任何其他程序中使用 - 至少不是我可以看到/知道的。

代码:因此,要向我的代码添加一些上下文:我正在向免费提供的 Kinect c# BodyBasics SDK v2 代码中编写一些快速手势检测代码。 这是我添加的一个辅助方法,当一个人在视野中时会被调用。 如果该人正在执行手势,则该方法会将帧时间和手势名称写入文本文件。

有一半时间,当代码正常运行时,手势识别运行良好。 但是,另一半时间,代码会中断/停止,因为写入文件位会导致错误。

下面是我的代码,用于查看此人是否站在中立位置 - 有点胡说八道,因此对此深表歉意。 我已经评论了错误所在的“错误”(不出所料):

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

}

任何将我指向正确轨道的解决方案/想法/建议将不胜感激。 我认为使用“使用流编写器”方法而不是我在这里使用的方法会很好 - 但我不确定如何? 任何帮助,将不胜感激。

附加信息:使用 Visual Studio 2015; 使用 Windows 10。

旁注:我在某处读到 Windows 10 中的 Windows 搜索工具会干扰并导致此类问题,所以我需要禁用它?

按照我的建议,我使用了 Filestream 方法并确保文件在使用后关闭。 但是,即使这样仍然会导致同样的错误。

因此,我也摆脱了快速连续的两个文件写入操作。 我不知道这在技术上是否正确或什至是真的,但基于这里的这篇文章: 链接,我的错误可能会出现,因为我正在尝试执行第二个“写入文本文件”行,而前一个“写入文本”行file' 行仍在执行/写入同一文件夹和位置 - 因此发生冲突? 请有人纠正我,如果我错了。

无论哪种方式,这似乎都奏效了。 请参阅下面的我编辑/更正的方法:

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

    }

请让我知道是否有任何方法可以使这个更优雅或其他任何我应该注意的答案。 该代码基于此处找到的代码: FileStream 教程网站

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM