我设法用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上搜索了很多东西,以至于我感到很困惑。
答案 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);
}
}