ZaneCen 2020-08-01 14:52 采纳率: 0%
浏览 146
已采纳

C#小白提问,自己修改了一些网上的代码,最后实用的时候出现了问题,不知道问题出在哪里,请大佬帮忙瞥一眼

建了几个方法,来监控一个文件夹内的变化,文件夹的内容由仪器传入,并将需要的内容提取出来,汇总到另一个文件。当数值达到要求的点后,启动Collect方法,但是现在出现的问题是,无法将内容提取并写入,达到了要求的点后,也无法调用collect方法。还会出现被另一个进程使用,无法访问的情况。
主要代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Text.RegularExpressions;
using System.Timers;
using System.Collections;
using System.IO;

namespace 自动收集样品
{
    public partial class Form1 : Form
    {
                 public struct Point
        {
            public double X;
            public double Y;
        }
        static void ReadTxtAndSaveAsDir()
        {
            string path = "D:\\ECNU\\紫外测试";
            //判断文件夹是否存在
            if (Directory.Exists(path))
            {
                DirectoryInfo directoryInfo = new DirectoryInfo(path);
                FileInfo[] files = directoryInfo.GetFiles();
                for (int i = files.Length - 1; i < files.Length; i++)
                {
                    if (files[i].Extension.Equals(".txt"))   //判断是否为txt文件
                    {
                        //文本文件完整路径\并且读入所有行
                        string[] strs = File.ReadAllLines(path + "\\" + files[i].Name);
                        // 创建字典
                        Dictionary<double, double> myDictionary = new Dictionary<double, double>();
                        // 让过前两行,从第三行开始处理
                        try
                        {
                            for (int j = 2; j < strs.Length; j++)
                            {
                                string line = strs[j];
                                // 拆分行
                                string[] v = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                                Point p;
                                // 获取Y(第一列)        
                                p.X = double.Parse(v[0]);
                                // 获取Y(第二列)        
                                p.Y = double.Parse(v[1]);
                                myDictionary.Add(p.X, p.Y);
                            }
                            // 至此,所有的数据点都在字典中了……  
                            double x = myDictionary[274];
                            double y = myDictionary[269];
                            double div = x / y;
                            WriteIn(x, y, div);
                            if (div > 1.2 && x > 0.01)
                            {
                                Collect();
                            }
                        }
                        catch (FormatException)
                        { }
                    }
                }
            }
            else { Directory.CreateDirectory(path); }
        }
                static public void WriteIn(double X, double Y, double Z)
        {
            //传入写入的内容
            string Text = "274nm=" + X + "," + "269nm=" + Y+"," + "274nm/269nm=" + Z;
            //判断文件是否存在
            if (File.Exists(@"E:\\ak.txt"))
            {
                StreamWriter sw = File.AppendText(@"E:\\ak.txt");
                //开始写入
                sw.WriteLine(Text);
                sw.Flush();
                sw.Close();
            }
            else
            {
                //创建并写入
                File.WriteAllText(@"E:\\ak.txt", Text + "\n");
            }
        }
                static public void Collect()
        {
            //启动收集样品
            //调整速度
            form.textBox1.AppendText("66\r\n");
            form.Send();
            //改为顺时针
            form.textBox1.AppendText("97\r\n");
            form.Send();
            //启动
            form.textBox1.AppendText("9\r\n");
            form.Send();

            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += new ElapsedEventHandler(form.stop);
            //到达时间的时候执行事件;    
            aTimer.Interval = 24000;
            // 设置引发时间的时间间隔 此处设置为24秒,注入体积为40毫升
            aTimer.AutoReset = false;
            //设置是执行一次(false)还是一直执行(true);
            aTimer.Enabled = true;
            //是否执行System.Timers.Timer.Elapsed事件
            //WatcherStart("D:\\ECNU\\紫外测试", "*.txt", false);//关闭监控
            form.button3.Enabled = true;//打开合成按钮
        }
                        public void stop(object source, ElapsedEventArgs e)
        {
            textBox1.AppendText("57\r\n");//停止指令
            Send();
        }
  • 写回答

2条回答 默认 最新

  • jingluan666 2020-08-01 16:07
    关注

    StreamWriter sw = File.AppendText(@"E:\\ak.txt");
    //开始写入
    sw.WriteLine(Text);
    sw.Flush();
    sw.Close();
    

    改为

    using (StreamWriter sw = File.AppendText(@"E:\\ak.txt"))
    {
        sw.WriteLine(Text);
        sw.Flush();
    }     
    

    以确保流被关闭并释放,因为using最终会调用对象的Dispose方法

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题