该进程无法访问文件“ XXX.txt”,因为它正在被另一个进程使用

时间:2019-08-13 09:25:29

标签: c#

我想写入和读取相同的文本文件。但是,我遇到了“该进程无法访问“ XXX.txt”,因为它正在被另一个进程使用”的问题。

我创建了两个类A和B,并以主要形式为每个类定义了两个对象。

A类将数据写入文本文件,而B类将同时从文本文件读取数据。

我已经将B类放在计时器中,而单击按钮时A类将开始。

A级:-

private void Processdata(string indata)
        {

        //======================================[TCP/IP]=====================================================//

        using (StreamWriter sw = new StreamWriter(TCPfilename, true))
        {   
            var time = DateTime.Now;
            string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");
            sw.WriteLine(formattedTime + "\t" + indata);
        }

        // Regular Expression for WIFI Drone & Phantom 3 Drone

        Regex regexp3_1 = new Regex(@"^AH(60601F740D70)(-\d{0,2})");
        Regex regexp3_2 = new Regex(@"^AH(60601F415CAF)(-\d{0,2})");
        Regex regexp3_3 = new Regex(@"^AH(60601F078D3E)(-\d{0,2})");
        Regex regexp3 = new Regex(@"^AH(60601F(\S{0,6}))(-\d{0,2})");
        Regex regexP3 = new Regex(@"^GGP3(\S{0,8})");
        Regex regexPA = new Regex(@"^AH(A0143D\S{0,6})(-\d{0,2})");
        Regex regex3D = new Regex(@"^AH(8ADC96\S{0,6})(-\d{0,2})");
        Regex regexMA = new Regex(@"^AH(60601F93F3FB)(-\d{0,2})");
        Regex regexMP = new Regex(@"^AH(60601F33729E)(-\d{0,2})");
        Regex regexTL = new Regex(@"^AH(60601FD8A1EF)(-\d{0,2})");

        // Regular Expression for WIFI

        Regex regexAH = new Regex(@"^AH(\S{0,12})(-\d{0,2})");
        Regex regexAH2 = new Regex(@"^AH(\S{0,12})(-\d{0,2})\S{0,6}(\S{0,74})");                          

        // Match WIFI Drone & Phantom 3 Drone Data with Regular Expression

        Match matchp3_1 = regexp3_1.Match(indata);
        Match matchp3_2 = regexp3_2.Match(indata);
        Match matchp3_3 = regexp3_3.Match(indata);
        Match matchp3 = regexp3.Match(indata);
        Match matchP3 = regexP3.Match(indata);
        Match matchPA = regexPA.Match(indata);
        Match match3D = regex3D.Match(indata);
        Match matchMA = regexMA.Match(indata);
        Match matchMP = regexMP.Match(indata);
        Match matchTL = regexTL.Match(indata);

        // Match WIFI Data with Regular Expression

        Match matchAH = regexAH.Match(indata);
        Match matchAH2 = regexAH2.Match(indata);

        using (StreamWriter rssi = new StreamWriter(TCPRSSIfilename, true))
        {
            var time = DateTime.Now;

            // Parrot
            if (matchPA.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");
                rssi.WriteLine(formattedTime + "; " + "Drone-Parrot" + "; " + matchPA.Groups[1].Value.ToString() + "; " + matchPA.Groups[0].Value.ToString() + "; " + matchPA.Groups[2].Value.ToString());
                rssi.Flush();
            }
            // 3DR
            else if (match3D.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");                    
                rssi.WriteLine(formattedTime + "; " + "Drone-3DR_Solo" + "; " + match3D.Groups[1].Value.ToString() + "; " + match3D.Groups[0].Value.ToString() + "; " + match3D.Groups[2].Value.ToString());
                rssi.Flush();
            }
            // Mavic Air
            else if (matchMA.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");                    
                rssi.WriteLine(formattedTime + "; " + "Drone-Mavic_Air" + "; " + matchMA.Groups[1].Value.ToString() + "; " + matchMA.Groups[0].Value.ToString() + "; " + matchMA.Groups[2].Value.ToString());
                rssi.Flush();
            }
            // Mavic Pro
            else if (matchMP.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");                    
                rssi.WriteLine(formattedTime + "; " + "Drone-Mavic_Pro" + "; " + matchMP.Groups[1].Value.ToString() + "; " + matchMP.Groups[0].Value.ToString() + "; " + matchMP.Groups[2].Value.ToString());
                rssi.Flush();
            }
            // Tello
            else if (matchTL.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");                   
                rssi.WriteLine(formattedTime + "; " + "Drone-Tello" + "; " + matchTL.Groups[1].Value.ToString() + "; " + matchTL.Groups[0].Value.ToString() + "; " + matchTL.Groups[2].Value.ToString());
                rssi.Flush();
            }
            // Specific Phantom 3 (MAC : 740D70)
            else if (matchp3_1.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");                    
                rssi.WriteLine(formattedTime + "; " + "Drone-DJI_Phantom_3_STD" + "; " + matchp3_1.Groups[1].Value.ToString() + "; " + matchp3_1.Groups[0].Value.ToString() + "; " + matchp3_1.Groups[2].Value.ToString());
                rssi.Flush();
            }
            // Specific Phantom 3 (MAC : 415CAF)
            else if (matchp3_2.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");                    
                rssi.WriteLine(formattedTime + "; " + "Drone-DJI_Phantom_3_STD" + "; " + matchp3_2.Groups[1].Value.ToString() + "; " + matchp3_2.Groups[0].Value.ToString() + "; " + matchp3_2.Groups[2].Value.ToString());
                rssi.Flush();
            }
            // Specific Phantom 3 (MAC : 078D3E)
            else if (matchp3_3.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");
                rssi.WriteLine(formattedTime + "; " + "Drone-DJI_Phantom_3_STD" + "; " + matchp3_3.Groups[1].Value.ToString() + "; " + matchp3_3.Groups[0].Value.ToString() + "; " + matchp3_3.Groups[2].Value.ToString());
                rssi.Flush();
            }
            // General Phantom 3
            else if (matchp3.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");                    
                rssi.WriteLine(formattedTime + "; " + "Drone-DJI_Phantom_3_STD" + "; " + matchp3.Groups[1].Value.ToString() + "; " + matchp3.Groups[0].Value.ToString() + "; " + matchp3.Groups[2].Value.ToString());
                rssi.Flush();
            }
            // WIFI
            else if (matchAH.Success && matchAH2.Success)
            {
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");                    
                rssi.WriteLine(formattedTime + "; " + "Wifi -" + matchAH2.Groups[3].Value.ToString() + "; " + matchAH.Groups[1].Value.ToString() + "; " + matchAH.Groups[0].Value.ToString() + "; " + matchAH.Groups[2].Value.ToString());
                rssi.Flush();
            }               
        }           
    }

B类:-

public void DisplayOnDataGridView(DataGridView dl, GMapControl gmap, string TCPRSSIfile, string UDPRSSIfile)
        {
        //================================[TCP/IP]==================================================//            

        using (StreamReader streamReader = new StreamReader(TCPRSSIfile, true))
        {
            string line = String.Empty;

            while ((line = streamReader.ReadLine()) != null)
            {
                Regex Search = new Regex(@"^(\S+ \S+); (\S+ -)(\S+); (\S+); (\S+); (\S+)");
                Match matchSearch = Search.Match(line);

                var time = DateTime.Now;
                string formattedTime = time.ToString("yyyy/MM/dd HH:mm:ss");

                StringBuilder sb = new StringBuilder();

                if (matchSearch.Groups[3].Value.ToString() != null)
                {
                    for (int i = 0; i <= matchSearch.Groups[3].Value.ToString().Length - 2; i += 2)
                    {
                        //Convert Hex format to standard ASCII string
                        sb.Append(Convert.ToString(Convert.ToChar(Int32.Parse(matchSearch.Groups[3].Value.ToString().Substring(i, 2), System.Globalization.NumberStyles.HexNumber))));
                    }
                }

                StringBuilder sbwifi = new StringBuilder(sb.Length);

                foreach (char c in sb.ToString())
                {
                    if ((int)c > 127) // 127 = Delete
                        continue;
                    if ((int)c < 32)  // 1-31 = Control Character 
                        continue;
                    if (c == ',')
                        continue;
                    if (c == '"')
                        continue;
                    sbwifi.Append(c);
                }

                Regex wifi = new Regex(@"^(\S+)\$");
                Match matchwifi = wifi.Match(sbwifi.ToString());

                if (matchwifi.Success)
                {
                    sbwifi.Clear();
                    sbwifi.Append(matchwifi.Groups[1].Value.ToString());
                }

                if (matchSearch.Success)
                {
                    try
                    {
                        if (dl.Rows.Count == 0)
                        {
                            if (matchSearch.Groups[2].Value.ToString().Contains("Wifi"))
                            {
                                using (StreamWriter rssi = new StreamWriter(@"D:\Skydroner\SearchReport.txt", true))
                                {
                                    string DroneNameNoEmptySpace = matchSearch.Groups[2].Value.ToString().Replace(" ", String.Empty) + sbwifi.ToString().Replace(" ", String.Empty);
                                    string DroneIDNoEmptySpace = matchSearch.Groups[4].Value.ToString().Replace(" ", String.Empty);
                                    rssi.WriteLine(formattedTime + " " + DroneNameNoEmptySpace + " " + DroneIDNoEmptySpace + " Detected");
                                }

                                string[] newlist = new string[] { matchSearch.Groups[2].Value.ToString() + " " + sbwifi.ToString(), matchSearch.Groups[4].Value.ToString(), matchSearch.Groups[1].Value.ToString(), "Add", "Distract", "", "" };
                                dl.Rows.Add(newlist);

                                dl.Rows[rownumber].Cells["Inject"].Style.BackColor = Color.DarkGray;
                                //DetectedZone(gmap, false);
                                Image img = Image.FromFile(@"D:\Image\no_status.PNG");
                                dl.Rows[rownumber].Cells["DroneStatus"].Value = img;
                            }
                            else
                            {
                                string[] newlist = new string[] { matchSearch.Groups[3].Value.ToString(), matchSearch.Groups[4].Value.ToString(), matchSearch.Groups[1].Value.ToString(), "Add", "Distract", "", "" };
                                dl.Rows.Add(newlist);

                                dl.Rows[rownumber].Cells["Inject"].Style.BackColor = Color.LightGreen;
                                //DetectedZone(gmap, true);
                                Image img = Image.FromFile(@"D:\Image\no_status.PNG");
                                dl.Rows[rownumber].Cells["DroneStatus"].Value = img;
                            }

                            dl.Rows[rownumber].Cells["Whitelist"].Style.BackColor = Color.LightGray;

                            RSSI_Signal(dl, matchSearch.Groups[6].Value.ToString(), rownumber);

                            rownumber = rownumber + 1;                                
                        }
                        else
                        {
                            for (int row = 0; row < dl.Rows.Count; row++)
                            {
                                if (dl.Rows[row].Cells["DroneID"].Value.ToString() == matchSearch.Groups[4].Value.ToString())
                                {
                                    if (matchSearch.Groups[2].Value.ToString().Contains("Wifi") == false)
                                    {
                                        Image img1 = Image.FromFile(@"D:\Image\alert.PNG");

                                        if (dl.Rows[row].Cells["DroneStatus"].Value != img1)
                                        {
                                            dl.Rows[row].Cells["DroneStatus"].Value = img1;
                                        }
                                    }

                                    dl.Rows[row].Cells["TimeDetected"].Value = matchSearch.Groups[1].Value.ToString();
                                    RSSI_Signal(dl, matchSearch.Groups[6].Value.ToString(), rownumber);
                                    duplicate = true;
                                }
                            }

                            if (!duplicate)
                            {
                                if (matchSearch.Groups[2].Value.ToString().Contains("Wifi"))
                                {
                                    using (StreamWriter rssi = new StreamWriter(@"D:\Skydroner\SearchReport.txt", true))
                                    {
                                        string DroneNameNoEmptySpace = matchSearch.Groups[2].Value.ToString().Replace(" ", String.Empty) + sbwifi.ToString().Replace(" ", String.Empty);
                                        string DroneIDNoEmptySpace = matchSearch.Groups[4].Value.ToString().Replace(" ", String.Empty);
                                        rssi.WriteLine(formattedTime + " " + DroneNameNoEmptySpace + " " + DroneIDNoEmptySpace + " Detected");
                                    }

                                    string[] newlist = new string[] { matchSearch.Groups[2].Value.ToString() + " " + sbwifi.ToString(), matchSearch.Groups[4].Value.ToString(), matchSearch.Groups[1].Value.ToString(), "Add", "Distract", "", "" };
                                    dl.Rows.Add(newlist);

                                    dl.Rows[rownumber].Cells["Inject"].Style.BackColor = Color.DarkGray;
                                    //DetectedZone(gmap, false);
                                    Image img = Image.FromFile(@"D:\Image\no_status.PNG");
                                    dl.Rows[rownumber].Cells["DroneStatus"].Value = img;
                                }
                                else
                                {
                                    string[] newlist = new string[] { matchSearch.Groups[3].Value.ToString(), matchSearch.Groups[4].Value.ToString(), matchSearch.Groups[1].Value.ToString(), "Add", "Distract", "", "" };
                                    dl.Rows.Add(newlist);

                                    dl.Rows[rownumber].Cells["Inject"].Style.BackColor = Color.LightGreen;
                                    //DetectedZone(gmap, true);
                                    Image img = Image.FromFile(@"D:\Image\no_status.PNG");
                                    dl.Rows[rownumber].Cells["DroneStatus"].Value = img;
                                }

                                dl.Rows[rownumber].Cells["Whitelist"].Style.BackColor = Color.LightGray;

                                RSSI_Signal(dl, matchSearch.Groups[6].Value.ToString(), rownumber);

                                rownumber = rownumber + 1;                                    
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                }
                else
                {
                    // Do Nothing
                }
            }
        }

        //========================================[UDP]===================================================//

        using (StreamReader streamReader = new StreamReader(UDPRSSIfile))
        {
            string line = String.Empty;

            while ((line = streamReader.ReadLine()) != null)
            {
                Regex Search = new Regex(@"^(\S+ \S+); (\S+); (\S+); (\S+); (\S+)");
                Match matchSearch = Search.Match(line);

                if (matchSearch.Success)
                {
                    try
                    {
                        //if (matchSearch.Groups[4].Value.ToString() != "0.000000")
                        //{
                        string[] newlist = new string[] { matchSearch.Groups[2].Value.ToString(), matchSearch.Groups[3].Value.ToString(), matchSearch.Groups[1].Value.ToString(), "Add", "Distract", "", "" };
                        dl.Rows.Add(newlist);
                        //}

                        dl.Rows[rownumber].Cells["Whitelist"].Style.BackColor = Color.LightGray;

                        if (dl.Rows[rownumber].Cells["DroneType"].Value.ToString().Contains("Wifi"))
                        {
                            dl.Rows[rownumber].Cells["Inject"].Style.BackColor = Color.DarkGray;
                            DetectedZone(gmap, false);
                        }
                        else
                        {
                            dl.Rows[rownumber].Cells["Inject"].Style.BackColor = Color.LightGreen;
                            DetectedZone(gmap, true);
                        }

                        Image img = Image.FromFile(@"D:\Image\arrow.jpg");
                        dl.Rows[rownumber].Cells["DroneStatus"].Value = img;

                        RSSI_Signal(dl, matchSearch.Groups[5].Value.ToString(), rownumber);

                        rownumber = rownumber + 1;
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                }
                else
                {
                    // Do Nothing
                }
            }
        }

        // Add Number for Each DataGridView Row
        if (null != dl)
            {
                foreach (DataGridViewRow r in dl.Rows)
                {
                    dl.Rows[r.Index].HeaderCell.Value = (r.Index + 1).ToString();
                }
            }
    }

主要形式:-

// ========呼叫类别A对象============== //

private void button2_Click(object sender, EventArgs e)
        {
            // TCP/IP Address - Debug TCP Text File - Debug UDP Text File - UDP Port Number - TCP/IP RSSI Text File - UDP RSSI Text File

        ListeningPole lp1 = new ListeningPole();
        lp1.PortConnect("192.168.1.133", @"D:\Skydroner\SkyDroner_DebugTCP_1.txt", @"D:\Skydroner\SkyDroner_DebugUDP_1.txt", 61557, @"D:\Skydroner\SkyDroner_TCP_RSSI_1.txt", @"D:\Skydroner\SkyDroner_UDP_RSSI_1.txt");

    }

// ========运行B类对象的计时器============== //

private void MainForm_Load(object sender, EventArgs e)
        {           
            // Start Timer for Display Scroll Mouse Message
            RowCountTimer.Interval = 1000;
            RowCountTimer.Start();
        } 

private void RowCountTimer_Tick(object sender, EventArgs e)
        {                   

            Display dp1 = new Display();
            dp1.DisplayOnDataGridView(DroneList, gmap, @"D:\Skydroner\SkyDroner_TCP_RSSI_1.txt", @"D:\Skydroner\SkyDroner_UDP_RSSI_1.txt");
        }

任何人都可以解决此错误。

请帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

在阅读之前,请确保在编写器上调用Close()将其关闭。我曾见过这样的实例,即与编写者一起使用using块可能无法及时关闭它,以使读者无法读取它。