我们经常害怕我们的一些私密文件是否被亲密的人动过,怎么来实现呢?
首先我们分析,我们需要一个监控文件被动过就能记录的一个服务,并且能够实现开机就能自启动,.net有个FileSystemWatcher可以监听,如果我们将它作为服务就能够实现我们的功能了。
.net官网https://docs.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher?redirectedfrom=MSDN&view=net-6.0
但是不包括服务,所以按照我的步骤一步一步往下来,其实操作很简单,官网提供的是文件被动过就能打印,我们可以将打印替换为写入某个文件以方便查看然后做成开机自启动的服务即可,我们开始吧!
首先我们将需要包先下载下来
然后是我的完整代码,我只告诉你们实现效果,因为逻辑很简单,相信你们代码一看就会
using NLog;
using System;
using System.IO;
using Topshelf;
namespace ConsoleApp1
{
class Program
{
private static readonly Logger logger = LogManager.GetLogger("Program");
static void Main(string[] args)
{
logger.Info($"Main主程序{DateTime.Now}");
var rc = HostFactory.Run(x => //1.启动程序
{
logger.Info($"主程序{DateTime.Now}");
x.Service<TownCrier>(s => //2.设置服务类型
{
s.ConstructUsing(name => new TownCrier()); //3.创建服务实例
s.WhenStarted(tc => tc.Start()); //4.启动程序
s.WhenStopped(tc => tc.Stop()); //5.停止程序
});
x.RunAsLocalSystem(); //6.本地系统运行
x.SetDescription("超级简单的windows服务"); //7.windows服务的描述
x.SetDisplayName("SimpleWindowsService 服务"); //8.windows服务的显示名称
x.SetServiceName("SimpleWindowsService"); //9.windows服务的服务名称
});
var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode()); //11.退出程序
Environment.ExitCode = exitCode;
}
public static string watchPath = @"D:\\我的";//监听的目录
public static string writePath = @"C:\\Users\\86139\\Desktop\\log.txt";//保存日志的地址,隐藏的
public static string fileType = "*.txt";//监听文件类型
public class TownCrier
{
private static readonly Logger logger = LogManager.GetLogger("logTest");
FileSystemWatcher watcher = new FileSystemWatcher(watchPath);
public TownCrier()
{
watcher.Filter = fileType;
watcher.IncludeSubdirectories = true;
watcher.EnableRaisingEvents = true;
watcher.NotifyFilter = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName
| NotifyFilters.FileName
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.Security
| NotifyFilters.Size;
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.Deleted += new FileSystemEventHandler(OnDeleted);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
watcher.Error += OnError;
Console.ReadLine();
}
public void Start()
{
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.Deleted += new FileSystemEventHandler(OnDeleted);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
watcher.Error += OnError;
}
public void Stop()
{
watcher.Changed -= new FileSystemEventHandler(OnChanged);
watcher.Created -= new FileSystemEventHandler(OnCreated);
watcher.Deleted -= new FileSystemEventHandler(OnDeleted);
watcher.Renamed -= new RenamedEventHandler(OnRenamed);
watcher.Error -= OnError;
}
}
private static void OnChanged(object sender, FileSystemEventArgs e)
{
if (e.ChangeType != WatcherChangeTypes.Changed)
{
return;
}
writelog($"Changed: {e.FullPath}");
}
private static void OnCreated(object sender, FileSystemEventArgs e)
{
string value = $"Created: {e.FullPath}";
writelog(value);
}
private static void OnDeleted(object sender, FileSystemEventArgs e) =>
writelog($"Deleted: {e.FullPath}");
private static void OnRenamed(object sender, RenamedEventArgs e)
{
writelog($"Renamed:");
writelog($" Old: {e.OldFullPath}");
writelog($" New: {e.FullPath}");
}
private static void OnError(object sender, ErrorEventArgs e) =>
PrintException(e.GetException());
private static void PrintException(Exception? ex)
{
if (ex != null)
{
writelog($"Message: {ex.Message}");
writelog("Stacktrace:");
writelog(ex.StackTrace);
PrintException(ex.InnerException);
}
}
private static void writelog(string info)
{
//定义新建文件时触发事件
if (!System.IO.File.Exists(writePath))
{
//没有则创建这个文件
FileStream fs1 = new FileStream(writePath, FileMode.Create, FileAccess.Write);//创建写入文件 //设置文件属性为隐藏
System.IO.File.SetAttributes(writePath, FileAttributes.Hidden);
StreamWriter sw = new StreamWriter(fs1);
sw.WriteLine(info);//开始写入值
sw.Close();
fs1.Close();
}
else
{
StreamReader sr = new StreamReader(writePath);
string txt = "";
while (!sr.EndOfStream)
{
string str = sr.ReadLine();
txt += str + "\n";
}
sr.Close();
FileStream fs = new FileStream(writePath, FileMode.Open, FileAccess.Write);
System.IO.File.SetAttributes(writePath, FileAttributes.Hidden);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(txt + info);//开始写入值
sw.Close();
fs.Close();
}
}
}
}
里面有些东西可能要改,
watchPath:监听的目录
writePath:需要将痕迹写入的地址
fileType:监听的类型
然后我们可以先运行一下去动一下文件看下效果
我将写入痕迹的地址放在桌面,然后是改变了文件的名称和内容。
没问题后我们写为服务,cmd(管理员),找到运行的控制台exe文件
ConsoleApp1.exe install(安装服务)
ConsoleApp1.exe start(开启服务)
ConsoleApp1.exe stop(关闭服务)
ConsoleApp1.exe uninstall(卸载服务)
以上便是我的完整代码及逻辑