zoukankan      html  css  js  c++  java
  • C# FileSystemWatcher 监视磁盘文件

    C# FileSystemWatcher 监视磁盘文件变更

    简化需求:有一个简化了的需求是这样的:有一个拍照程序在运行,一旦抓拍之后则将图片文件存储至某目录,然后图片要上传至远程服务器并update数据库。

    原需求:原先的需求是这样的:有一台PDA扫码枪,一个IP照相机放置在下线区传送带上方。当PDA扫描箱子上的条码,触发相机拍照,将图片流传至远端服务器,找到对应的条码,将图片存储并更新数据库。

    然而我不知道PDA扫描的瞬间如何与IP相机通信(蓝牙或WLAN?),其实关键是我不知道怎样使用IP相机的外触发功能,增加蓝牙触发器?也不知道怎样hack或ssh到这个相机(应该是linux的吧),所以只能先使用简化需求的版本。

    而简化需求的版本,关键就是监视文件夹内容变化与上传文件流。

    昨天问了下度娘,C#中的监视组件名字叫做FileSystemWatcher。

    于是写了个demo,可以监视所有逻辑盘或者某个文件夹。

    使用方法:

    1.直接打开是监视所有逻辑磁盘文件变化。

    2.或者传递参数,监视某一路径文件变化。如图,监视e盘

    源代码:

    复制代码
      1 namespace FileSystemWatcherDemo
      2 {
      3     class Program
      4     {
      5         static void Main(string[] args)
      6         {
      7             //watcher组
      8             FileSystemWatcher[] watchers;
      9 
     10             //若未传递参数,则监视所有文件系统,包括CD-ROM(不可用),可移动磁盘(不可用)等
     11             if (args.Length == 0)
     12             {
     13                 string[] drivers = Directory.GetLogicalDrives();
     14                 watchers = new FileSystemWatcher[drivers.Length];
     15 
     16                 for (int i = 0; i < drivers.Length; i++)
     17                 {
     18                     try
     19                     {
     20                         watchers[i] = new FileSystemWatcher { Path = drivers[i] };
     21                     }
     22                     catch (Exception ex)
     23                     {
     24                         Trace.TraceWarning(ex.Message);
     25                     }
     26                 }
     27             }
     28             else
     29             {
     30                 watchers = new FileSystemWatcher[1];
     31                 watchers[0] = new FileSystemWatcher { Path = args[0] };
     32             }
     33 
     34             foreach (FileSystemWatcher w in watchers)
     35             {
     36                 if (w == null) continue;
     37 
     38                 w.Filter = "*";
     39                 w.IncludeSubdirectories = true;
     40                 w.EnableRaisingEvents = true;
     41 
     42                 w.Created += onFileSystem_Changed;
     43                 w.Deleted += onFileSystem_Changed;
     44                 w.Changed += onFileSystem_Changed;
     45                 w.Renamed += watcher_Renamed;
     46             }
     47 
     48             Console.ReadLine();
     49         }
     50 
     51         #region [ 检测文件是否占用 ]
     52         /// <summary>
     53         /// 检测文件是否占用
     54         /// </summary>
     55         /// <param name="filename"></param>
     56         /// <returns></returns>
     57         static bool IsFileReady(string filename)
     58         {
     59             var fi = new FileInfo(filename);
     60             FileStream fs = null;
     61             try
     62             {
     63                 fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.None);
     64                 return true;
     65             }
     66             catch (IOException)
     67             {
     68                 return false;
     69             }
     70 
     71             finally
     72             {
     73                 if (fs != null)
     74                     fs.Close();
     75             }
     76         }
     77         #endregion
     78 
     79         private static volatile object _lock = true;
     80         static void onFileSystem_Changed(object sender, FileSystemEventArgs e)
     81         {
     82             lock (_lock)
     83             {
     84                 Console.ForegroundColor = ConsoleColor.DarkGray;
     85                 Console.Write("[");
     86                 Console.Write(DateTime.Now.ToString("HH:mm:ss"));
     87                 Console.Write("] ");
     88 
     89                 switch (e.ChangeType.ToString().ToLower())
     90                 {
     91                     case "created":
     92                         //while (!IsFileReady(e.FullPath))
     93                         //{
     94                         //    if (!File.Exists(e.FullPath))
     95                         //        return;
     96                         //    Thread.Sleep(100);
     97                         //}
     98                         Console.ForegroundColor = ConsoleColor.Green;
     99                         Console.Write(e.ChangeType);
    100                         Console.ForegroundColor = ConsoleColor.White;
    101                         Console.Write(" ");
    102                         Console.Write(e.Name);
    103                         Console.Write(" ");
    104                         Console.ForegroundColor = ConsoleColor.DarkGray;
    105                         Console.Write(e.FullPath);
    106 
    107                         break;
    108                     case "deleted":
    109                         Console.ForegroundColor = ConsoleColor.Red;
    110                         Console.Write(e.ChangeType);
    111                         Console.ForegroundColor = ConsoleColor.White;
    112                         Console.Write(" ");
    113                         Console.Write(e.Name);
    114                         Console.Write(" ");
    115                         Console.ForegroundColor = ConsoleColor.DarkGray;
    116                         Console.Write(e.FullPath);
    117                         break;
    118                     case "changed":
    119                         Console.ForegroundColor = ConsoleColor.Cyan;
    120                         Console.Write(e.ChangeType);
    121                         Console.ForegroundColor = ConsoleColor.White;
    122                         Console.Write(" ");
    123                         Console.Write(e.Name);
    124                         Console.Write(" ");
    125                         Console.ForegroundColor = ConsoleColor.DarkGray;
    126                         Console.Write(e.FullPath);
    127                         break;
    128                 }
    129 
    130                 Console.Write("
    ");
    131             }
    132         }
    133         static void watcher_Renamed(object sender, RenamedEventArgs e)
    134         {
    135             Console.ForegroundColor = ConsoleColor.Magenta;
    136             Console.Write(e.ChangeType);
    137             Console.ForegroundColor = ConsoleColor.White;
    138             Console.Write(" ");
    139             Console.Write(e.OldName);
    140             Console.Write(e.OldFullPath);
    141             Console.ForegroundColor = ConsoleColor.Yellow;
    142             Console.Write(" ");
    143             Console.Write(e.Name);
    144             Console.Write(e.FullPath);
    145             Console.Write(Thread.CurrentThread.Name);
    146             Console.Write("
    ");
    147         }
    148     }
    149 }
    复制代码

    仍有bug,望高手指正。

    附上编译好的exe,可以直接运行。

     
     
    标签: 文件监视
  • 相关阅读:
    不能初始化ps2020,因为意外的遇到文件尾
    关于在云服务器上邮箱等功能无法正常的解决方法|phpcmsv9
    WAMP环境配置|apache24配置|php7配置|MySQL8配置
    SAP(ABAP) ABAP内部外部数据转换常用function
    移动平台对 META 标签的定义
    JavaScript/Jquery:Validform 验证表单的相关属性解释
    android开发问题 Failed to pull selection 菜鸟记录
    下载android sdk更新包离线安装解决方案
    android:inputType常用取值
    访问IIS元数据库失败解决方法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4104924.html
Copyright © 2011-2022 走看看