c# .net写一个监控电脑文件被动过痕迹的服务(开机自启)

3 篇文章 0 订阅

我们经常害怕我们的一些私密文件是否被亲密的人动过,怎么来实现呢?

首先我们分析,我们需要一个监控文件被动过就能记录的一个服务,并且能够实现开机就能自启动,.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(卸载服务)

以上便是我的完整代码及逻辑

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是使用C#.net framework4.5.2编的OneDrive文件下载服务的示例代码: 首先,需要在Visual Studio中创建一个窗体应用程序,并添加以下命名空间引用: ```csharp using System; using System.Net; using System.IO; ``` 接下来,在窗体应用程序中添加一个按钮和一个文本框。按钮用于触发文件下载操作,文本框用于输入要下载的文件的URL地址。 然后,在按钮的Click事件处理程序中添加以下代码: ```csharp private void btnDownload_Click(object sender, EventArgs e) { string url = txtUrl.Text; // 获取文件的URL地址 using (WebClient client = new WebClient()) { client.Headers.Add("Authorization", "Bearer " + YOUR_ACCESS_TOKEN); // 添加访问令牌 client.DownloadFileAsync(new Uri(url), "downloadedFile.txt"); // 异步下载文件 client.DownloadProgressChanged += client_DownloadProgressChanged; // 注册下载进度变化事件 client.DownloadFileCompleted += client_DownloadFileCompleted; // 注册下载完成事件 } } private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; // 更新进度条的值 } private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) { MessageBox.Show("文件下载完成!"); // 下载完成后弹出提示框 } ``` 在上面的代码中,我们使用WebClient类来下载文件。在下载之前,需要添加访问令牌来进行身份验证。下载完成后,会触发DownloadFileCompleted事件,并在其中弹出一个提示框来通知用户文件已经下载完成。同时,我们还注册了DownloadProgressChanged事件来更新进度条的值。 请注意,上面的示例代码中的YOUR_ACCESS_TOKEN需要替换为你自己的访问令牌。你可以在OneDrive开发人员中心获取访问令牌。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值