WithCoderWithCoderWithCoder

C#按行读写txt文件内容(断网续传数据)

    今天在用C#的winform开发串口读写程序时,有一个需求时候需要将读取的串口数据发送到远程服务器。发送成功后,突然想到如果断网后,数据发送不成功时,就需要将数据先保存到本地,在网络正常后,再将数据补传到服务器。

    这个需求的基本想法如下:

    1. 数据上传失败(断网或其他情况),把数据按行保存到txt文件

    2. 启动一个新的子线程,轮询判断txt文件是否有需要补传的数据

    3. 如果有数据要补传,按行读取上传,成功后,删除已上传数据,继续轮询

    简单的实现流程如下(暂不考虑异常情况,且补传数据保存到可执行exe文件同级目录):

    1. 模拟上传失败,保存上报数据到可执行文件目录下的txt文件   

        /*
         * 模拟上传失败,保存数据
         */
        private void saveData()
        {
            // 可执行文件目录
            string exeDir = System.Windows.Forms.Application.StartupPath;
            // 上传失败数据存储文件
            string backFile = "back.txt";
            // 保存上传失败数据(数据附加到已有数据后面)
            StreamWriter backWriter = new StreamWriter(exeDir + "\\" + backFile, true);
            backWriter.WriteLine("我是上传失败后需要补传的数据");
            backWriter.Close();
        }

    2. 开启子线程,调用补传方法,代码如下:   

        /*
        * 开启子线程,检查是否有需要补传数据
        */
        private void backUpload()
        {
            ThreadStart thStart = new ThreadStart(backPro);// threadStart委托,backPro为补传方法 
            Thread thread = new Thread(thStart);
            thread.Priority = ThreadPriority.Normal;
            thread.IsBackground = false;
            // 启动子线程
            thread.Start();
        }

    3. 补传方法循环判断是否有补传数据,如果有就进行补传,并删掉已上传成功的数据   

        /*
        * 轮询判断,补传数据
        */
        public void backPro()
        {
            while (true)
            {
                // 可执行文件目录
                string exeDir = System.Windows.Forms.Application.StartupPath;
                // 上传失败数据存储文件
                string backFile = exeDir + "\\" + "back.txt";
                if (File.Exists(backFile))
                {
                    // 一次读取一行数据,补传
                    StreamReader sr = new StreamReader(backFile, Encoding.UTF8);
                    string content = sr.ReadLine();// 读取一行记录
                    string allContent = sr.ReadToEnd(); // 读取剩余记录(用于前面读取的行数据补传成功后,更新补传数据)
                    sr.Close();
                    
                    bool isUpSuccess = true; // 是否补传成功
                    
                    /*
                     * 这里调用补传方法,并返回是否补传成功
                     */
                     
                    // 如果补传成功,删除已补传数据
                    if (isUpSuccess)
                    {
                        // 上传成功,保存剩余记录
                        StreamWriter sw = new StreamWriter(backFile, false);
                        sw.Write(allContent);
                        sw.Close();
                    }
                }
                // 阻塞线程1秒
                Thread.Sleep(1000);
            }
        }


欢迎分享交流,转载请注明出处:WithCoder » C#按行读写txt文件内容(断网续传数据)