C#:文件更新IRTime时,仅在.txt文件中打印LAST行

时间:2018-11-20 10:30:06

标签: c# c++

我设法用C ++编写可以满足所需功能的代码。病倒了。但是它的控制台应用程序和我需要Windows窗体应用程序。所以我尝试在Visual Studio 2017和C#中做到这一点。

我需要一个会在屏幕上发布的应用程序,只有.txt文件的最后一行,但是该.txt文件需要在应用程序运行时可编辑。因此,当我在.txt中添加新行并按ctrl + s时,它将自动更新应用程序中的结果,并且不会向我显示

“注意:该进程无法访问该文件,因为该文件正在被另一个进程使用。”

这是完美的C ++代码:

std::ifstream ifs("test.log");

if (ifs.is_open())

{std::string line;

    while (true)

    {while (std::getline(ifs, line)) std::cout << line << "\n";
        if (!ifs.eof()) 
break; 
        ifs.clear();
    }
}
return 0;}

它从test.log文件返回最后一行,当我在测试文件中粘贴新的一行时,它将更改保存在test.txt文件中后自动更改。

这是我用C#编写的代码,但运行后它可以正常工作,但它不允许我将更改保存在我进行更改的文件中。

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text;
using System.IO;


namespace lastone
{
    public partial class last : Form
    {
        public last()
        {
            InitializeComponent();
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Stream myStream;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();



                if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {

                    {
                        if ((myStream = openFileDialog1.OpenFile()) != null)
                        {

                            string strfilename = openFileDialog1.FileName;

                        richTextBox1.Text = File.ReadLines(strfilename).Last();

                        }
                    }
                }

        }
    }
}

在这种情况下,我使用按钮和openfiledialog加载test.txt文件...,然后仅打印出richTextbox中的最后一行。

有人可以给我建议,让我的应用正常运行时如何使test.txt文件可编辑吗? 而且,如果我设法绕过了这个问题,我该如何使我不需要再次打开文件的应用程序才能找到test.txt中的更改?我需要它自动“刷新” ...

P.S。我真的是编程的新手,所以不要判断我:)而且我不是英语母语的人,所以对不起我的错误。我在Google上搜索了很多东西,以至于我感到很困惑。

1 个答案:

答案 0 :(得分:0)

这是一个示例控制台应用程序,它涉及如何使用FileSystemWatcher来监视文件的更改:

FileSystemWatcher watcher = new FileSystemWatcher();

void Main()
{
    // get file from OFD etc
    watcher.Path = @"c:\temp";
    watcher.Filter = "myfile.txt";
    watcher.Changed += OnChanged;
    watcher.EnableRaisingEvents = true;

    // needed for this example as a console app doesn't have an 
    // event loop unlike Windows Forms
    while (true) {
        Thread.Sleep(100);
    }
}

private static void OnChanged(object source, FileSystemEventArgs e)
{
    string line = null;
    using (FileStream logFileStream = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (StreamReader logFileReader = new StreamReader(logFileStream))
    {

        while (!logFileReader.EndOfStream)
        {
            line = logFileReader.ReadLine();
        }
    }

    // Event fires twice unders some circumstances
    // https://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice
    // so ignore the value if it is empty
    if (!string.IsNullOrEmpty(line))
    {
        // do what you want with the line here
        Console.WriteLine("last line: " + line);
    }

}