C#監(jiān)聽(tīng)txt文檔獲取新數(shù)據(jù)方式
前言
之前有個(gè)需求就是監(jiān)聽(tīng)文件夾中最新的txt文檔獲取最新數(shù)據(jù),還有其他功能,
比如:開(kāi)機(jī)自啟動(dòng)、只在任務(wù)管理器關(guān)閉、阻止Ctrl+C中斷等,對(duì)此作個(gè)記錄,整理代碼。
一、監(jiān)聽(tīng)txt文檔增加數(shù)據(jù)
代碼如下:
static void RunMainLogic()
{
//1. 獲取程序基目錄
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
//2.拼接相對(duì)路徑(目標(biāo)路徑 - 文件夾)并轉(zhuǎn)換為絕對(duì)路徑
string relativePath = @"..\..\..\..\TotalTest\Debug";
string targetDir = Path.GetFullPath(Path.Combine(baseDir, relativePath));
//3.檢查目標(biāo)目錄是否存在
if (!Directory.Exists(targetDir))
{
Console.WriteLine("目標(biāo)目錄不存在:{" + targetDir + "}");
return;
}
//4.獲取所有名稱(chēng)包含“Test”的子文件夾,并按時(shí)間排序
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 = "開(kāi)始監(jiān)控文件夾: {" + folderPath + "}";
Console.WriteLine(str);
//txt文檔監(jiān)聽(tīng)
TextFileWatcher watcher = new TextFileWatcher(folderPath); //先被執(zhí)行
watcher.DataReceived += OnDataReceived; //訂閱事件
watcher.SetNewestFileAsTarget();
}
//訂閱事件
static void OnDataReceived(object sender, string data)
{
string StrLine = data; //需要的數(shù)據(jù)
}
二、其他功能
1. 設(shè)置開(kāi)機(jī)自啟動(dòng)
代碼如下:
static void SetAutoStart(string appName, string appPath)
{
RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
key.SetValue(appName, appPath);
key.Close();
}
作用:將程序添加到注冊(cè)表啟動(dòng)項(xiàng),實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)運(yùn)行。
調(diào)用方式:
SetAutoStart("MyConsoleApp", System.Reflection.Assembly.GetExecutingAssembly().Location);
2. 禁止控制臺(tái)窗口關(guān)閉按鈕
代碼如下:
[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, false);
EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED);
}
作用:禁用窗口的x關(guān)閉按鈕,用戶(hù)無(wú)法直接關(guān)閉程序。
3. 阻止Ctrl + C中斷
代碼如下:
Console.CancelKeyPress += (sender, e) => e.Cancel = true;
作用:防止用戶(hù)按 Ctrl + C 終止程序。
4. 防止程序退出(無(wú)限循環(huán))
代碼如下:
while(true)
{
Thread.Sleep(1000); //防止CPU占用過(guò)高
}
作用:讓程序無(wú)限運(yùn)行,除非任務(wù)管理器終止或程序報(bào)錯(cuò)。
總結(jié)
如將開(kāi)機(jī)自啟動(dòng)和只能在任務(wù)管理器關(guān)閉放到監(jiān)聽(tīng)txt文檔功能。
在主函數(shù)中,代碼如下:
//1. 設(shè)置開(kāi)機(jī)自啟動(dòng)
SetAutoStart("ConsoleApplication1", System.Reflection.Assembly.GetExecutingAssembly().Location);
//2. 禁用關(guān)閉按鈕
DisableCloseButton();
//3. 阻止Ctrl+C 關(guān)閉
Console.CancelKeyPress += (sender, e) =>
{
e.Cancel = true; // 阻止默認(rèn)行為
Console.WriteLine("Ctrl+C 被禁用,無(wú)法關(guān)閉程序。");
};
//4. 主要業(yè)務(wù)邏輯
RunMainLogic();
//5. 防止程序退出(無(wú)限循環(huán))
while (true)
{
Thread.Sleep(1000); // 每秒鐘檢查一次(防止 CPU 占用過(guò)高)
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c# WPF中通過(guò)雙擊編輯DataGrid中Cell的示例(附源碼)
這篇文章主要介紹了c# WPF中通過(guò)雙擊編輯DataGrid中Cell的示例(附源碼),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
C#中String.LastIndexOf方法小結(jié)
String.LastIndexOf()是C#中string類(lèi)的一個(gè)方法,它用于在字符串中查找指定子字符串(或字符)最后一次出現(xiàn)的位置,并返回其索引,本文主要介紹了C#中String.LastIndexOf方法小結(jié),感興趣的可以了解一下2024-01-01
C#實(shí)現(xiàn)合并多個(gè)word文檔的方法
這篇文章主要介紹了C#實(shí)現(xiàn)合并多個(gè)word文檔的方法,是C#針對(duì)Word文檔操作的一個(gè)非常重要的技巧,需要的朋友可以參考下2014-09-09
C# PLINQ 內(nèi)存列表查詢(xún)優(yōu)化歷程
這篇文章主要介紹了C# PLINQ 內(nèi)存列表查詢(xún)優(yōu)化歷程的相關(guān)資料,需要的朋友可以參考下2016-03-03

