zoukankan      html  css  js  c++  java
  • 利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具

    利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具

    独立观察员 2020 年 12 月 26 日

    前一段看到微信公众号 “码农读书” 上发了一篇文章《如何使用 C# 中的 FileSystemWatcher》(翻译自:https://www.infoworld.com/article/3185447/how-to-work-with-filesystemwatcher-in-c.html ),其中简述了使用 FileSystemWatcher 进行文件系统变更监测的方法,本人受此启发,决定制作一个文件夹变动监控的小工具,当作练手和自用。目前该工具已制作完成,故发文分享给大家。

    利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具插图

    功能比较简单,运行程序后,点击 “选择文件夹” 按钮选择想要监控的文件夹,然后点击 “开始监控文件变动” 即可。可以检测 文件夹 / 文件 的创建、删除、修改、重命名,然后在信息窗中输出相关信息。如果取消勾选 “是否显示完全路径”,则输出的信息中将不包含选择的 “文件夹路径” 部分,也就是显示的是相对路径。如果取消勾选 “是否监控子文件夹”,则程序将不监控子文件夹内的变动情况。

    保存配置按钮可进行保存如下信息,下次打开程序会恢复保存的状态:

    利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具插图1

    关键代码如下(文末会给出代码仓库地址):

    #region 文件夹监控
    
    private FileSystemWatcher _FileSystemWatcher = new FileSystemWatcher();
    
    //参考:https://www.infoworld.com/article/3185447/how-to-work-with-filesystemwatcher-in-c.html
    
    /// <summary>
    /// 开始监控目录
    /// </summary>
    /// <param name="path">目录路径</param>
    /// <param name="isIncludeSubDir">是否包括子目录</param>
    private async void MonitorDirectory(string path, bool isIncludeSubDir = true)
    {
        _FileSystemWatcher.EnableRaisingEvents = false;
        _FileSystemWatcher = new FileSystemWatcher();
        _FileSystemWatcher.Path = path;
        _FileSystemWatcher.IncludeSubdirectories = isIncludeSubDir;
    
        _FileSystemWatcher.Created += FileSystemWatcher_Created;
        _FileSystemWatcher.Renamed += FileSystemWatcher_Renamed;
        _FileSystemWatcher.Deleted += FileSystemWatcher_Deleted;
        _FileSystemWatcher.Changed += FileSystemWatcher_Changed;
    
        //开始监控
        _FileSystemWatcher.EnableRaisingEvents = true;
    
        await ConfirmBoxHelper.ShowMessage(DialogVm, $"已开启监控:[{Configs.FolderPath}]");
    }
    
    private void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"【{GetPathType(e.FullPath)}更改】{GetPath(e)}");
    }
    
    private void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"【{GetPathType(e.FullPath)}创建】{GetPath(e)}");
    }
    
    private void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"【{GetPathType(e.FullPath)}重命名】{GetOldPath((RenamedEventArgs)e)} --> {GetPath(e)}");
    }
    
    private void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"【{GetPathType(e.FullPath)}删除】{GetPath(e)}");
    }
    
    /// <summary>
    /// 获取变动的路径的显示字符串
    /// </summary>
    private string GetPath(FileSystemEventArgs e)
    {
        if (Configs.IsShowFullPath)
        {
            return e.FullPath;
        }
    
        return e.Name;
    }
    
    /// <summary>
    /// 获取原先路径的显示字符串
    /// </summary>
    private string GetOldPath(RenamedEventArgs e)
    {
        if (Configs.IsShowFullPath)
        {
            return e.OldFullPath;
        }
    
        return e.OldName;
    }
    
    #endregion
    
    #region 判断是文件还是文件夹
    
    /// <summary>
    /// 获取路径类型(判断是文件还是文件夹)
    /// </summary>
    /// <param name="path">路径</param>
    /// <returns>PathTypeEnum</returns>
    public static PathTypeEnum GetPathType(string path)
    {
        if (File.Exists(path))
        {
            return PathTypeEnum.文件;
        }
        else if (Directory.Exists(path))
        {
            return PathTypeEnum.文件夹;
        }
        else
        {
            return PathTypeEnum.不存在;
        }
    }
    
    /// <summary>
    /// 路径类型枚举
    /// </summary>
    public enum PathTypeEnum
    {
        文件, 文件夹, 不存在
    }
    
    #endregion

    值得注意的就是,FileSystemWatcher 开启和关闭监控是通过 EnableRaisingEvents 这个 bool 属性进行控制的。然后就是主要的四个事件,增、删、改、重命名,分别指定好回调方法:

    _FileSystemWatcher.Created += FileSystemWatcher_Created;
    _FileSystemWatcher.Renamed += FileSystemWatcher_Renamed;
    _FileSystemWatcher.Deleted += FileSystemWatcher_Deleted;
    _FileSystemWatcher.Changed += FileSystemWatcher_Changed;​

    还有一点就是,其它事件的参数都是 FileSystemEventArgs 类型,而重命名事件的独有参数是 RenamedEventArgs 类型,这个是前者的子类,多了旧的文件名和路径等信息。

    程序和代码都展示完了,又到了和大家说再见的时刻了,在此附上代码地址和另一篇参考文章吧:

    代码地址:https://gitee.com/dlgcy/DLGCY.FilesWatcher

    发行版地址:https://gitee.com/dlgcy/DLGCY.FilesWatcher/releases

    又一参考:《FileSystemWatcher 用法详解》(https://blog.csdn.net/hwt0101/article/details/8469285)(里面也有个监控软件,不过我没下载,大家可以试试)

    待更新:目前信息窗口信息多的话会触发 “灭霸模式”,后面考虑加个开关。 

    好了,就到这里吧,谢谢阅读。

    原创文章,转载请注明: 转载自 独立观察员・博客

    本文链接地址: 利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具 [http://dlgcy.com/files-watcher/]

    微信公众号

  • 相关阅读:
    [刘阳Java]_eayui-pagination分页组件_第5讲
    [刘阳Java]_easyui-draggable拖动组件_第4讲
    [刘阳Java]_easyui-panel组件入门级_第3讲
    [刘阳Java]_TortoiseSVN基础应用_第1讲
    [刘阳Java]_SpringMVC文件上传第2季_第11讲
    [刘阳Java]_Spring中IntrospectorCleanupListener的用途【补充】_第16讲
    使用fetch代替ajax请求 post传递方式
    react购物车demo
    react-redux异步数据操作
    redux模块化demo
  • 原文地址:https://www.cnblogs.com/weiliuhong/p/files-watcher.html
Copyright © 2011-2022 走看看