开发者

C#监听txt文档获取新数据方式

目录
  • 前言
  • 一、监听txt文档增加数据
  • 二、其他功能
    • 1. 设置开机自启动
    • 2. 禁止控制台窗口关闭按钮
    • 3. 阻止Ctrl + C中断
    • 4. 防止程序退出(无限循环)
  • 总结

    前言

    之前有个需求就是监听文件夹中最新的txt文档获取最新数据,还有其他功能,

    比如:开机自启动、只在任务管理器关闭、阻止Ctrl+C中断等,对此作个记录,整理代码。

    一、监听txt文档增加数据

    代码如下:

    static void RunMainLogic()
    {
    	//1. 获取程序基目录
    	string baseDir = AppDomain.CurrentDomain.BaseDirectory;
    
    	//2.拼接相对路径(目标路径 - 文件夹)并转换为绝对路径
    	string relativePath = @"..\..\..\..\TotalTest\Debug";
    	string targetDir = Path.GetFullPath(Path.Combine(baseDir, relativePath));
    
    	//3.检查目标目录是否存在
    	if (!Directory.Exists(targetDir))
    	{
        	Console.WriteLine("目标目录不存在:{" + targetDir + "}");
        	return;
    	}
    
    	//4.获取所有名称包含“Test”的子文件夹,并按时间排序
    	var latsetTestDir = Directory.GetDirectories(targetDir, "*Test*", SearchOption.TopDirectoryOnly)
        	.Select(dir => new DirectoryInfo(dir))
        	.OrderByDescending(dir => dir.LastWriteTime)
        	.FirstOrDefault();
    
    	if (latsetTestDir == null)
    	{
        	Console.WriteLine("Test文件夹路径不存在!");
        	return;
    	}
    
    	string folderPath = latsetTestDir.FullName;
    
    	string str = "开始监控文件夹: {" + folderPath + "}";
    	Console.WriteLine(str);
    
    	//txt文档监听
    	TextFileWatcher watcher = new TextFileWatcher(folderPath); //先被执行
    	watcher.DataReceived += OnDataReceived; //订阅事件
    	watcher.SetNewestFileAsTarget();
    
    }
    
    //订阅事件
    static void OnDataReceived(object sender, string data)
    {
    	string StrLine = data; //需要的数据
    }
    

    二、其他功能

    1. 设置开机自启动

    代码如下:

    static void SetAutoStart(string appName, string appPath)
    {
        RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
        key.SetValue(appName, appPath);
        key.Close();
    }
    

    作用:将程序添加到注册表启动项,实现开机自动运行。

    调用方式

    SetAutoStart("MyConsoleApp", System.Reflection.Assembly.GetExecutingjsAssembly().Location);
    

    2. 禁止控制台窗口关闭按钮

    代码如下:

    [DllImport("user32.dll")]
    private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
    
    [DllImport("user32.dll")]
    private static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);
    
    private const uint SC_CLOSE = 0xF060;
    private const uint MF_GRAYED = 0x00000001;
    
    static void DisableCloseButton()
    {
        IntPtr hWnd = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
        IntPtr hMenu = GetSystemMenu(hWnd, f编程客栈alse);
        EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED);
    }
    

    作用:禁用窗口的x关闭按钮,python用户无法直接关闭程序。

    3. 阻止Ctrl + C中断

    代码如下:

    Console.CancelKeyPress += (sender, e) => e.Cancel = true;
    

    作用:防止用户按 Ctrl + C 终止程序。

    4. 防止程序退出(无限循环)

    代码如下:

    while(true)
    {
    	Thread.Sleep(1000); //防止CPU占用过高
    }
    

    作用:让程序无限运行,除非任务管理器终止程序报错

    总结

    如将开机自启动只能在任务管理器关闭放到监听txt文档功能。

    在主函数中,代码如下:

    //1. 设置开机自启动
    SetAutoStart("ConsoleApplication1", System.Reflection.Assembly.GetExecutingAssembly().Location);
    
    //2. 禁用javascript关闭按钮
    DisableCloseButton();
    
    //3. 阻止Ctrl+C 关闭
    Console.CancelKeyPress += (sender, e) =>
    {
        e.Cancel = true; // 阻止默认行为
        Console.WriteLine("Ctrl+C 被禁用,无法关闭程序。");
    编程};
    
    //4. 主要业务逻辑
    RunMainLogic();
    
    //5. 防止程序退出(无限循环)
    while (true)
    {
        Thread.Sleep(1000); // 每秒钟检查一次(防止 CPU 占用过高)
    }
    

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜